今天研究了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=
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=