打算写一些入门级别的多线程笔记,等我把多线程的函数都整理完再一点点添加(一下子全都搞上去,会有种抓不到重点的感觉)
线程创建函数pthread_create(4)
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
参数:
thread: 用于标识一个线程,它是一个pthread_t类型的变量,在头文件pthreadtypes.h中定义,如下所示。
typedef unsigned long int thread_t;
attr: 设置线程它属性,如果为NULL,则采用默认属性。
start_routine: 函数指针,当线程的资源分配好后,线程就会运行这个线程函数。
arg: 线程函数的参数。
函数返回值:
0: 线程创建成功
非0: 线程创建失败
线程的结束函数pthread_join(2)和pthread_exit(1)
1. int pthread_join(pthread_t thread, void **retval);
描述:
pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。
参数:
thread: 线程标识符,即线程ID,标识唯一线程。
retval: 用户定义的指针,用来存储被等待线程的返回值。
返回值:
0代表成功。 失败,返回的则是错误号。
补充: linux线程中,pthread有两种状态joinable状态和unjoinable状态。
(1)joinable状态下,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符。只有当你调用了pthread_join之后这些资源才会被释放,这是需要main函数或者其他线程去调用pthread_join函数。
(2)unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。设置unjoinable状态设置有两种办法 一是可以在pthread_create时指定,二是线程创建后在线程中pthread_detach自己 pthread_detach(pthread_self()),状态改为unjoinable状态,确保资源的释放。
2. void pthread_exit(void* retval)
线程通过调用pthread_exit函数终止执行,就如同进程在结束时调用exit函数一样。这个函数的作用是,终止调用它的线程并返回一个指向某个对象的指针。
其中,retval可以从pthread_join(2)的第二个参数获得。
好,来看一个例子吧:
描述:
主线程和子线程交替打印,在主线程中等待子线程推出,主线程会阻塞在line27,在子线程退出后,主线程打印退出的信息。
在编译的时候需要链接线程库libpthread,所以要加一个-lpthread。
#include <stdio.h> #include <pthread.h> #include <unistd.h> void* helloThread(void *args) { int i = 0; while(i<10) { printf("thread id:%d says hi!%d\n",getpid(),i); ++i; usleep(1); } pthread_exit("finished!"); } int main() { pthread_t tid; pthread_create(&tid,NULL,helloThread,NULL); int i = 0; while(i<10) { printf("main says hi %d\n",i); ++i; usleep(1); } char *p = NULL; pthread_join(tid,(void**)&p); printf("exit args is: %s\n",p); printf("thread finished\n"); return 0; }