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


pthread_cancel和pthread_joinLinux多线程编程中常用的两个函数,用于线程的终止和等待线程的结束。 pthread_cancel函数用于取消指定线程的执行,其原型为: ```c int pthread_cancel(pthread_t thread); ``` 该函数会向指定线程发送取消请求,但并不会立即终止线程的执行。被取消的线程需要在适当的时候检查取消请求,并在合适的地方调用pthread_exit函数来终止自己的执行。 pthread_join函数用于等待指定线程的结束,其原型为: ```c int pthread_join(pthread_t thread, void **retval); ``` 该函数会阻塞调用线程,直到指定的线程结束。如果指定线程已经结束,那么该函数会立即返回。通过retval参数可以获取被等待线程的返回值。 搭配使用时,通常的流程是先创建线程,然后在需要的时候调用pthread_cancel函数取消线程的执行,最后使用pthread_join函数等待线程的结束。 以下是一个示例代码: ```c #include <pthread.h> #include <stdio.h> #include <unistd.h> void* thread_func(void* arg) { printf("Thread started\n"); sleep(5); printf("Thread finished\n"); pthread_exit(NULL); } int main() { pthread_t thread; pthread_create(&thread, NULL, thread_func, NULL); sleep(2); pthread_cancel(thread); void* retval; pthread_join(thread, &retval); printf("Thread joined\n"); return 0; } ``` 在上述示例中,主线程创建了一个新线程,并在2秒后调用pthread_cancel函数取消该线程的执行。然后使用pthread_join函数等待线程的结束,并打印出"Thread joined"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值