简单的例子包含了许多不易说明的问题,所以我喜欢简单例。
另文件多用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