pthread
目录
基础API头文件: 失败返回错误号,不能用perror打印错误信息,使用strerror(ret) pthread_self
pthread_create
pthread_exit
参数: pthread_join
pthread_detach
pthread_cancel
pthread_equal
线程属性的设置通过属性设置线程的分离 使用注意事项
实例程序pthread_create使用输出顺序不确定 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <pthread.h> void *myfunc(void * arg) { // 打印子线程ID printf("child thread id: %ludn",pthread_self()); return NULL; } int main(int argc,const char * argv[]) { // 创建一个子线程 // 线程ID对应的变量 pthread_t pthid; pthread_create(&pthid,NULL,myfunc,NULL); printf("parent thread id: %ludn",pthread_self()); for (int i = 0; i < 5; i++) { printf("i = %dn",i); } sleep(2); return 0; } 传值与传地址#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <pthread.h> void *myfunc(void *arg) { //int num = *(int*)arg; int num = (int)arg; // 打印子线程ID printf("%dth child thread id: %lun",num,pthread_self()); } int main(void) { pthread_t pthid[5]; int i; for (i = 0; i < 5; i++) { //pthread_create(&pthid[i],(void*)&i); // 由于int存储空间和指针的存储空间相同所以可以这么传 pthread_create(&pthid[i],(void*)i); } printf("parent thread id: %lu",pthread_self()); for (i = 0; i < 5; i++) // 子线程不会执行接下来的for循环 printf("i = %dn",i); sleep(2); return 0; } 主线程先退出主线程先退出,子线程正常执行 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <pthread.h> void *myfunc(void *arg) { printf("child pthread id: %lun",pthread_self()); printf("child thread .....n"); int i; for (i = 0; i < 3; i++) printf("child i = %dn",i); //return NULL; } int main(void) { int i; pthread_t thid; int ret = pthread_create(&thid,NULL); if (ret != 0) { printf("error number: %dn",ret); printf("error information: %sn",strerror(ret)); } printf("parent pthread id: %lun",pthread_self()); // 退出主线程,子线程不受影响 pthread_exit(NULL); printf("parent thread .....n"); for (i = 0; i < 3; i++) printf("i = %dn",i); return 0; } /* parent pthread id: 139948367210304 child pthread id: 139948358948608 child thread ..... child i = 0 child i = 1 child i = 2 */ join与pthread_exit没有return返回和return NULL结果一样都是 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <pthread.h> int number = 100; void *myfunc(void *arg) { printf("child pthread id: %lun",pthread_self()); printf("child thread .....n"); number++; int i; for (i = 0; i < 3; i++) printf("child i = %dn",i); // return NULL; // Segmentation fault (core dumped) //return &number; pthread_exit(&number); } int main(void) { int i; pthread_t thid; int ret = pthread_create(&thid,pthread_self()); int *ptr; // 阻塞等待子线程的结束,并回收pch pthread_join(thid,(void**)&ptr); printf("++++++ number = %dn",*ptr); printf("parent thread .....n"); for (i = 0; i < 3; i++) printf("i = %dn",i); return 0; } /* parent pthread id: 139819023099712 child pthread id: 139819014838016 child thread ..... child i = 0 child i = 1 child i = 2 ++++++ number = 101 parent thread ..... i = 0 i = 1 i = 2 */ 两个线程数当线程A数的数字还没有写入内存中时,就已经失去cpu #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <pthread.h> #define MAX 1000 // 全局变量 int number; // 线程处理函数 void* funcA_num(void* arg) { for(int i=0; i<MAX; ++i) { int cur = number; cur++; number = cur; printf("Thread A,id = %lu,number = %dn",pthread_self(),number); usleep(10); } return NULL; } void* funcB_num(void* arg) { for(int i=0; i<MAX; ++i) { int cur = number; cur++; number = cur; printf("Thread B,number); usleep(10); } return NULL; } int main(int argc,const char* argv[]) { pthread_t p1,p2; // 创建两个子线程 pthread_create(&p1,funcA_num,NULL); pthread_create(&p2,funcB_num,NULL); // 阻塞,资源回收 pthread_join(p1,NULL); pthread_join(p2,NULL); return 0; } /* number可能数的数字不足 */ 使用pthread_cancel杀死分离的线程#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <pthread.h> void* myfunc(void* arg) { printf("child pthread id: %lun",pthread_self()); while (1) { printf("hahan"); sleep(2); } return NULL; } int main(int argc,const char* argv[]) { pthread_t thid; // 初始化线程属性 pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); // 返回错误号 int ret = pthread_create(&thid,&attr,NULL); if(ret != 0) { printf("error number: %dn",ret); // 根据错误号打印错误信息 printf("error information: %sn",pthread_self()); pthread_cancel(thid); sleep(1); pthread_attr_destroy(&attr); pthread_exit(NULL); //return 0; } /* parent pthread id: 140625550829376 child pthread id: 140625542567680 haha */ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |