C++ pthread入门指南
作者:SGchi
一、pthread简介
pthread是C++98接口且只支持Linux,使用时需要包含头文件#include <pthread.h>,编译时需要链接pthread库,其中p是POSIX的缩写,而POSIX是Portable Operating System Interface的缩写,是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称。(Windows环境下无pthread,Linux GCC4.6以下编译需加-pthread编译选项)
1、线程创建
int pthread_create (pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *),void *arg);
若创建成功,返回0;若出错,则返回错误编号。
- thread 是线程标识符,但这个参数不是由用户指定的,而是由 pthread_create 函数在创建时将新的线程的标识符放到这个变量中。
- attr 指定线程的属性,包含了线程的调度策略,堆栈的相关信息,join or detach 的状态等,可以用 NULL 表示默认属性。
- start_routine 指定线程开始运行的函数。
- arg 是 start_routine 所需要的参数,是一个无类型指针。
pthread_attr_t 操作函数:
pthread_attr_t attr; // 声明attr pthread_attr_init(&attr); // 创建attr pthread_attr_destroy(&attr); // 销毁attr pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); // 设置为joinable
2、线程终止
void pthread_exit (void *retval); int pthread_cancel (pthread_t thread);
当发生以下情形之一时,线程就会结束:
- 线程运行的函数return了,也就是线程的任务已经完成;
- 线程调用了 pthread_exit 函数;
- 其他线程调用 pthread_cancel 结束这个线程;
- 进程调用 exec() 或 exit(),结束了;
- main() 函数先结束了,而且 main() 自己没有调用 pthread_exit 来等所有线程完成任务。
当然,一个线程结束,并不意味着它的所有信息都已经消失,后面会看到僵尸线程的问题。
一个线程可以通过调用 pthread_cancel 函数来请求取消同一进程中的线程,这个线程由thread 参数指定。如果操作成功则返回0,失败则返回对应的错误编号。
3、线程同步
int pthread_join(pthread_t threadid, void **value_ptr); int pthread_detach (threadid);
阻塞是线程之间同步的一种方法。pthread_join 函数会让调用它的线程等待 threadid 线程运行结束之后再运行,value_ptr 存放了其他线程的返回值。
一个可以被join的线程,仅仅可以被别的一个线程 join,如果同时有多个线程尝试 join 同一个线程时,最终结果是未知的。另外,线程不能 join 自己。
值得注意的的是:僵尸线程 ( “zombie” thread )是一种已经退出了的 joinable 的线程,但是等待其他线程调用
pthread_join 来 join 它,以收集它的退出信息(exit status)。如果没有其他线程调用 pthread_join 来
join 它的话,它占用的一些系统资源不会被释放,比如堆栈。如果main()函数需要长时间运行,并且创建大量 joinable的线程,就有可能出现堆栈不足的 error 。 对于那些不需要 join 的线程,最好利用
pthread_detach,这样它运行结束后,资源就会及时得到释放。注意一个线程被使用 pthread_detach
之后,它就不能再被改成 joinable 的了。 总而言之,创建的每一个线程都应该使用 pthread_join 或者
pthread_detach 其中一个,以防止僵尸线程的出现。
4、其他函数
pthread_self (); // 返回当前线程的 thread ID pthread_equal (thread1,thread2); // pthread_equal 比较两个线程的 ID,如果不同则返回0,否则返回一个非零值 // 互斥锁 pthread_mutex_t mutexsum; pthread_mutex_init (mutex,attr); pthread_mutex_destroy (pthread_mutex_t *mutex); pthread_mutexattr_init (attr); pthread_mutexattr_destroy (attr); phtread_mutex_lock(pthread_mutex_t *mutex); phtread_mutex_trylock(pthread_mutex_t *mutex); phtread_mutex_unlock(pthread_mutex_t *mutex);
5、示例代码
#include<stdlib.h> #include <pthread.h> #include <stdio.h> #include <math.h> #define NUM_THREADS 4 void *BusyWork(void *t) { int i; long tid; double result = 0.0; tid = (long) t; printf("Thread %ld starting...\n", tid); for (i = 0; i < 1000000; i++) { result = result + sin(i) * tan(i); } printf("Thread %ld done. Result = %e\n", tid, result); pthread_exit((void *) t); } int main(int argc, char *argv[]) { pthread_t thread[NUM_THREADS]; pthread_attr_t attr; int rc; long t; void *status; /* Initialize and set thread detached attribute */ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); for (t = 0; t < NUM_THREADS; t++) { printf("Main: creating thread %ld\n", t); rc = pthread_create(&thread[t], &attr, BusyWork, (void *) t); if (rc) { printf("ERROR; return code from pthread_create() is %d\n", rc); exit(-1); } } /* Free attribute and wait for the other threads */ pthread_attr_destroy(&attr); for (t = 0; t < NUM_THREADS; t++) { rc = pthread_join(thread[t], &status); if (rc) { printf("ERROR; return code from pthread_join() is %d\n", rc); exit(-1); } printf("Main: completed join with thread %ld having a status of %ld\n", t, (long) status); } printf("Main: program completed. Exiting.\n"); pthread_exit(NULL); }
Main: creating thread 0 Main: creating thread 1 Thread 0 starting... Thread 1 starting... Main: creating thread 2 Main: creating thread 3 Thread 2 starting... Thread 3 starting... Thread 1 done. Result = -3.153838e+06 Thread 0 done. Result = -3.153838e+06 Main: completed join with thread 0 having a status of 0 Main: completed join with thread 1 having a status of 1 Thread 3 done. Result = -3.153838e+06 Thread 2 done. Result = -3.153838e+06 Main: completed join with thread 2 having a status of 2 Main: completed join with thread 3 having a status of 3 Main: program completed. Exiting.
参考链接:C++ 多线程编程(二):pthread的基本使用
到此这篇关于C++ pthread入门指南的文章就介绍到这了,更多相关C++ pthread内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!