线程编程
操作用户空间中的线程
创建线程
•调用该线程函数的入口点
•使用函数pthread_create(),线程创建后,就开始运行相关的线程函数
#include <stdio.h> #include <stdlib.h> #include <pthread.h> void *thrd_func(void *arg); pthread_t tid; int main(){ // 创建线程tid,且线程函数由thrd_func指向,是thrd_func的入口点,即马上执行此线程函数 if (pthread_create(&tid,NULL,thrd_func,NULL)!=0) { printf("Create thread error!\n"); exit(1); } printf("TID in pthread_create function: %u.\n",tid); printf("Main process: PID: %d,TID: %u.\n",getpid(),pthread_self()); sleep(1); //race return 0; } void *thrd_func(void *arg){ // printf("I am new thread!\n"); printf("New process: PID: %d,TID: %u.\n",getpid(),pthread_self()); //why pthread_self printf("New process: PID: %d,TID: %u.\n",getpid(),tid); //why pthread_self pthread_exit(NULL); //退出线程 // return ((void *)0); }
退出线程
•在线程函数运行完后,该线程也就退出了
•或使用函数pthread_exit(),这是线程的主动行为
•不能使用exit()
使调用进程终止,所有线程都终止了
等待线程
•由于一个进程中的多个线程是共享数据段的,通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放
•pthread_join()函数
类似进程的wait()/waitpid()函数,用于将当前线程挂起来等待线程的结束
是一个线程阻塞的函数,调用它的线程一直等待到被等待的线程结束为止
函数返回时,被等待线程的资源就被收回
#include <stdio.h> #include <stdlib.h> #include <pthread.h> void *thrd_func1(void *arg); void *thrd_func2(void *arg); int main(){ pthread_t tid1,tid2; void *tret; // 创建线程tid1,线程函数thrd_func1 if (pthread_create(&tid1,NULL,thrd_func1,NULL)!=0) { printf("Create thread 1 error!\n"); exit(1); } // 创建线程tid2,线程函数thrd_func2 if (pthread_create(&tid2,NULL,thrd_func2,NULL)!=0) { printf("Create thread 2 error!\n"); exit(1); } // 等待线程tid1结束,线程函数返回值放在tret中 if (pthread_join(tid1,&tret)!=0){ printf("Join thread 1 error!\n"); exit(1); } printf("Thread 1 exit code: %d.\n",(int *)tret); // 等待tid2结束,线程函数返回值放在tret中 if (pthread_join(tid2,&tret)!=0){ printf("Join thread 2 error!\n"); exit(1); } printf("Thread 2 exit code: %d.\n",(int *)tret); return 0; } void *thrd_func1(void *arg){ printf("Thread 1 returning!\n"); // sleep(3); return ((void *)1); // 自动退出线程 } void *thrd_func2(void *arg){ printf("Thread 2 exiting!\n"); pthread_exit((void *)2); // 线程主动退出,返回(void *)2 }
取消线程
•在别的线程中要终止另一个线程
•pthread_cancel()函数
•被取消的线程可以设置自己的取消状态
–被取消的线程接收到另一个线程的取消请求之后,是接受还是忽略这个请求
–如果接受,是立刻进行终止操作还是等待某个函数的调用等
#include <stdio.h> #include <stdlib.h> #include <pthread.h> void *thrd_func1(void *arg); void *thrd_func2(void *arg); pthread_t tid1,tid2; int main(){ // 创建线程tid1,线程函数thrd_func1 if (pthread_create(&tid1,NULL,thrd_func1,NULL)!=0) { printf("Create thread 1 error!\n"); exit(1); } // 创建线程tid2,线程函数thrd_func2 if (pthread_create(&tid2,NULL,thrd_func2,NULL)!=0) { printf("Create thread 2 error!\n"); exit(1); } // 等待线程tid1退出 if (pthread_join(tid1,NULL)!=0){ printf("Join thread 1 error!\n"); exit(1); }else printf("Thread 1 Joined!\n"); // 等待线程tid2退出 if (pthread_join(tid2,NULL)!=0){ printf("Join thread 2 error!\n"); exit(1); }else printf("Thread 2 Joined!\n"); return 0; } void *thrd_func1(void *arg){ // pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); // 设置其他线程可以cancel掉此线程 while(1) { printf("Thread 1 is running!\n"); sleep(1); } pthread_exit((void *)0); } void *thrd_func2(void *arg){ printf("Thread 2 is running!\n"); sleep(5); if (pthread_cancel(tid1)==0) // 线程tid2向线程tid1发送cancel printf("Send Cancel cmd to Thread 1.\n"); pthread_exit((void *)0); }