简单的例子包含了许多不易说明的问题,所以我喜欢简单例。
另文件多用cpp命名,因为c++ compiler 比c 的更友好,功能更强,例如支持随意设置变量,支持bool 变量类型等...
pthread_join 例
gitserver@gitserver-desktop:~/share/hjj$ cat pthread_join.cpp #include <stdio.h> #include <unistd.h> #include <pthread.h> void *MyThread(void *args) { printf("I will exit after 5 senconds\n"); sleep(5); } int main(int argc, char **argv) { printf("hello\n"); pthread_t threadID; pthread_create(&threadID, NULL, MyThread,NULL); pthread_join(threadID, NULL); printf("bye, bye\n"); return 0; }
简单说明一下:
thread 的函数原型必须是带一个void * 参数。void * 返回类型的函数。
用pthread_create 创建线程,4 个参数, 线程无参用NULL 传递。
多用man 查阅吧。
gitserver@gitserver-desktop:~/share/hjj$ gcc -g -o pthread_join pthread_join.cpp -lpthread
运行:
gitserver@gitserver-desktop:~/share/hjj$ ./pthread_join
hello
I will exit after 5 senconds
bye, bye
signal set 例
//signaltest.c #include <stdio.h> #include <unistd.h> #include <signal.h> #include <pthread.h> #include <time.h> sigset_t gSigalSet; void myfunc() { printf("hello\n"); } // 子线程功能 // 1. 线程等待信号集合阻塞, // 2 根据信号输出字符串或退出线程 // 3. sleep 函数,单位秒 // 4. 进程的函数原型 void *MyThread(void *p) { int signum; while(1){ sigwait(&gSigalSet,&signum); if(signum == SIGUSR1) { myfunc(); } else if(signum == SIGUSR2) { printf("I will sleep 2 second and exit\n"); sleep(2); break; } } } // 主线程功能 // 1.录入字符, // 2. 信号集合操作 // 3. 创建线程 // 4. 给子线程发信号。 // 5. 等待子线程退出 int main() { sigemptyset(&gSigalSet); sigaddset(&gSigalSet,SIGUSR1); sigaddset(&gSigalSet,SIGUSR2); sigprocmask(SIG_SETMASK,&gSigalSet,NULL); pthread_t threadID; int res=pthread_create(&threadID,NULL,MyThread,NULL); printf("threadID is 0x%lx, result is %d\n", threadID,res); bool bRun = true; while(bRun) { printf(":>"); char c=fgetc(stdin); switch(c) { case 'a': pthread_kill(threadID,SIGUSR1); //发送SIGUSR1信号,打印字符串。 break; case 'q': pthread_kill(threadID,SIGUSR2); //发出SIGUSR2信号,让线程退出,如果发送SIGKILL,线程将直接退出。 pthread_join(threadID,NULL); //等待线程threadID执行完毕,这里阻塞。 printf("finish\n"); bRun=false; break; default: ; } } return 0; }编译及运行:
gitserver@gitserver-desktop:~/share/hjj$ gcc -o sigset sigset.cpp -lpthread
gitserver@gitserver-desktop:~/share/hjj$ ./sigset
threadID is 0xb782db70, result is 0
:>a
:>:>hello
q
I will sleep 2 second and exit
finish