一、线程标识
- 线程有ID, 但不是系统唯一, 而是进程环境中唯一有效.
- 线程的句柄是pthread_t类型, 该类型不能作为整数处理, 而是一个结构.
下面介绍两个函数:
- 头文件: <pthread.h>
- 原型: int pthread_equal(pthread_t tid1, pthread_t tid2);
- 返回值: 相等返回非0, 不相等返回0.
- 说明: 比较两个线程ID是否相等.
- 头文件: <pthread.h>
- 原型: pthread_t pthread_self();
- 返回值: 返回调用线程的线程ID.
二、线程创建
在执行中创建一个线程, 可以为该线程分配它需要做的工作(线程执行函数), 该线程共享进程的资源. 创建线程的函数pthread_create()
- 头文件: <pthread.h>
- 原型: int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(start_rtn)(void), void *restrict arg);
- 返回值: 成功则返回0, 否则返回错误编号.
- 参数:
- tidp: 指向新创建线程ID的变量, 作为函数的输出.
- attr: 用于定制各种不同的线程属性, NULL为默认属性(见下).
- start_rtn: 函数指针, 为线程开始执行的函数名.该函数可以返回一个void *类型的返回值,而这个返回值也可以是其他类型,并由 pthread_join()获取
- arg: 函数的唯一无类型(void)指针参数, 如要传多个参数, 可以用结构封装.
- 因为pthread的库不是linux系统的库,所以在进行编译的时候要加上 -lpthread
- 也可以自己在编译器里设置好pthread的路径,然后就可以直接通过编译器编译了
#include<iostream> #include<stdio.h> #include<pthread.h> #include<unistd.h> using namespace std; void *func1(void *ptr) { for(int i=0; i<5; i++) { printf("This is thread1!\n"); sleep(1); } } void *func2(void *ptr) { for(int i=0; i<5; i++) { printf("This is thread2!\n"); sleep(1); } } int main() { pthread_t id1,id2; int thread1 = pthread_create(&id1,NULL,func1,NULL); if(thread1) { printf("Create thread1 error!\n"); return 1; } int thread2 = pthread_create(&id2,NULL,func2,NULL); if(thread2) { printf("Create thread2 error!\n"); return 1; } pthread_join(id1,NULL); pthread_join(id2,NULL); return 0; }
向线程传递参数
#include<iostream> #include<stdio.h> #include<pthread.h> #include<unistd.h> using namespace std; void *func(void *ptr) { int *num = (int*)ptr; printf("a = %d\n",*num); } int main() { int a = 666; int *p = &a; pthread_t id; int thread = pthread_create(&id,NULL,func,p); if(thread) { printf("Create thread error!\n"); return 1; } sleep(1); printf("Thread is created!\n"); return 0; }
三、线程属性
pthread_create()中的attr参数是一个结构指针,结构中的元素分别对应着新线程的运行属性,主要包括以下几项:
__detachstate,表示新线程是否与进程中其他线程脱离同步,如果置位则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到 PTHREAD_CREATE_JOINABLE状态。