linux pthread_join & sigset 的使用例子

简单的例子包含了许多不易说明的问题,所以我喜欢简单例。

另文件多用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


你可能感兴趣的:(JOIN,linux,kill,null,compiler)