linux系统下线程的编写

本文详细介绍了Linux下线程创建的方法及线程属性设置。包括pthread_create函数的使用方法及其参数解释,线程属性如joinable和detached的区别,线程的阻塞、取消和退出机制等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天研究了linux下线程的创建:

linux下创建一个线程的函数是:
int pthread_create(pthread_t *restrict thread,
                const pthread_attr_t *restrict attr,
                void *(*start_routine)(void*), void *restrict arg);
各个参数的意义:
thread:所创建的线程号,即线程ID。
attr:所创建的线程属性。
start_routine:即将运行的线程函数。
art:传递给线程函数的参数。

线程函数的格式:
void * Thread_Function(void *);                      

函数pthread_join让主线程阻塞,直到所有线程都已经退出。
int pthread_join(pthread_t thread, void ** value_ptr);

thread:等待退出线程的线程号。
value_ptr:退出线程的返回值。

一部分线程不愿意主线程调用pthread_join来等待他们,这样的线程的属性为detached,如果pthread_create()时将属性设置为NULL,则表明我们希望所创建的线程采用默认的属性,也就是joinable。
在线程设置为joinable后,可以调用pthread_detach()使之成为detached。但是反之则不行。还有,如果线程已经调用pthread_join()后,则再调用pthread_detach()则不会有任何效果。

线程可以通过自身执行结束来结束,也可以通过调用pthread_exit()来结束线程的执行。另外,线程甲可以被线程乙被动结束,通过调用pthread_cancel()来达到目的。
int pthread_cancel(pthread_t thread);函数调用成功返回0。

线程可以通过设置自身的属性来决定如何结束。线程分异步终结和同步终结,异步终结是其他线程调用pthread_cancel的时候,线程立刻被结束,同步终结会继续运行,直到到达下一个结束点。线程默认创建是同步终结。
通过调用pthread_setcanceltype来设置终结状态。
pthread_setcanceltype(int type, int *oldtype);
state:要设置的状态,可以为PTHREAD_CANCEL_DEFERRED或者PTHREAD_CANCEL_ASYNCHRONOUS。
最常用的创建终结点就是调用pthread_testcancel()的地方。该函数除了检查同步终结时的状态,其他什么也不做。

通过pthread_setcancelstate()来设置终结类型:即该线程可不可以被终结
int pthread_setcancelstate(int state, int *oldstate);
state:要设置的终结状态,可以为PTHREAD_CANCEL_DISABLE或者PTHREAD_CANCEL_ENABLE。

线程的本质:在linux系统中,新建的线程不是在原先的进程中,而是系统通过一个系统调用clone(),该系统copy了一个和原先进程完全一个的进程,并在这个线程中执行线程函数。不过这个copy过程和fork不一样。copy后的进程和原先的进程共享了所有的变量,运行环境。这样,原先进程中的变量变动在copy后的进程中便能体现出来。

pthread的编译:
On linux:
$ gcc -o thread thread.c -lpthread

On FreeBSD:
$ gcc -o thread thread.c -pthread


本文参考了网上资料:
1、http://blog.youkuaiyun.com/chary8088/archive/2008/05/08/2417982.aspx
2、http://www.linuxforum.net/forum/showthreaded.php?Cat=&Board=program&Number=353966&page=&view=&sb=&o=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值