多线程pthread_t
来源:互联网 发布:太阳能无网络监控器 编辑:程序博客网 时间:2024/04/28 00:15
多线程pthread_t
使用Xcode 6.3.2进行测试
1.需要包含头文件 pthread.h
2.创建线程
pthread_create(pthread_t *, const pthread_attr_t *, void *(*)(void *), void *)
参数说明
pthread_t * 表示线程ID,声明方式pthread_t tid;
const pthread_attr_t * 表示线程的参数,参考
void *(*)(void *)表示线程开始时执行的函数,如void fun(void*),也可使用类的静态函数
void* 为第三个参数所代表的函数的参数,即void* fun(void*)中第二个void*
返回值为0表示成功,其他为错误
例:#include <iostream>#include <pthread.h>#include <unistd.h> //sleep函数的头文件void* callFunToPrintfA(void * args);void* callFunToPrintfB(void * args);int main(int argc, const char * argv[]) { pthread_t tidToCallFunToPrintfA; pthread_t tidToCallFunToPrintfB; int i = pthread_create(&tidToCallFunToPrintfA, NULL, callFunToPrintfA, NULL); int i2 = pthread_create(&tidToCallFunToPrintfB, NULL, callFunToPrintfB, NULL); if(i!=0 || i2!=0){ printf("ERROR,ERROR CODE: %d,%d",i,i2); } pthread_exit( NULL );//等待线程结束后在结束进程}void* callFunToPrintfA(void * args){ while (1) { printf("A"); sleep(1); }return NULL;}void* callFunToPrintfB(void * args){ while (1) { printf("B"); sleep(1); }return NULL;}
输出结果:
A
B
A
B
……
3.向线程传递参数
例
#include <iostream>#include <pthread.h>#include <unistd.h>void* callFunToPrintfByArgs(void * args);int main(int argc, const char * argv[]) { int c[3]; pthread_t tidToCallFunToPrintfByArgs[3]; for (int i = 0; i<3; i++) { c[i] = 'A'+i;//有时线程已经运行,但传递的参数尚未及时赋值,故先将参数保存到内存中再传递 int i2 = pthread_create(&tidToCallFunToPrintfByArgs[i], NULL, callFunToPrintfByArgs,(void*)&c[i]); if(i2!=0){ printf("ERROR:%d",i2); } } pthread_exit( NULL );//等待线程结束后在结束进程}void* callFunToPrintfByArgs(void * args){ while (1) { auto d = *((char*)args); printf("%c\n",d); sleep(1); } return NULL;}
输出(省略换行符)
CBA CBA CBA CBA CAB CBA CBA CBA CBA …….
输出混乱,无法确定先后顺序
3.结束线程
pthread_exit(void *);
描述:调用该函数即结束调用该函数的进程;
参数 :pthread_t : 线程标识符,即线程ID,标识唯一线程。
例:
#include <iostream>#include <pthread.h>#include <unistd.h>pthread_t A;void* PrintfThread(void* args);int main(int argc, const char * argv[]) { int i1 = pthread_create(&A, NULL, PrintfThread, NULL); if(i1 != 0){ printf("ERROR:%d",i1); } pthread_exit( NULL );//等待线程结束后在结束进程}void* PrintfThread(void* args){ for(int i =1 ;i<=100;i++){ sleep(0.3); printf("%d\n",i); if (i>=50) { pthread_exit(NULL);//如无此行代码则输出1-100 } } return NULL;}
输出为1-50
pthread_exit(NULL)成功将线程结束。
4.线程阻塞
pthread_join(pthread_t, void **);
描述:调用pthread_join即等待参数中的线程结束后在执行其他线程
参数 :pthread_t: 线程标识符,即线程ID,标识唯一线程。
返回值 : 0代表成功。 失败,返回的则是错误号。
未使用阻塞
#include <iostream>#include <pthread.h>#include <unistd.h>pthread_t A;pthread_t B;void* ThreadA(void* args);void* ThreadB(void* args);int main(int argc, const char * argv[]) { int i1 = pthread_create(&A, NULL, ThreadA, NULL); int i2 = pthread_create(&B, NULL, ThreadB, NULL); if(i1 != 0){ printf("ERROR:%d,%d",i1,i2); } pthread_exit( NULL );//等待线程结束后在结束进程}void* ThreadA(void* args){ for(int i =1 ;i<=5;i++){ sleep(0.3); printf("%d\n",i); } return NULL;}void* ThreadB(void* args){ for(int i =6 ;i<=10;i++){ sleep(0.3); printf("%d\n",i); } return NULL;}
输出
6
1
7
2
3
4
5
8
9
10
使用阻塞
#include <iostream>#include <pthread.h>#include <unistd.h>pthread_t A;pthread_t B;void* ThreadA(void* args);void* ThreadB(void* args);int main(int argc, const char * argv[]) { int i1 = pthread_create(&A, NULL, ThreadA, NULL); pthread_join(A, NULL);//使用阻塞 int i2 = pthread_create(&B, NULL, ThreadB, NULL); if(i1 != 0){ printf("ERROR:%d,%d",i1,i2); } pthread_exit( NULL );//等待线程结束后在结束进程}void* ThreadA(void* args){ for(int i =1 ;i<=5;i++){ sleep(0.3); printf("%d\n",i); } return NULL;}void* ThreadB(void* args){ for(int i =6 ;i<=10;i++){ sleep(0.3); printf("%d\n",i); } return NULL;}
输出
1
2
3
4
5
6
7
8
9
10
调用pthread_join即等待参数中的线程结束后在执行其他线程
5.放弃争用
pthread_yield_np();
描述:调用即放弃本轮到该线程的执行时间
例:
#include <iostream>#include <pthread.h>#include <unistd.h>pthread_t A;pthread_t B;int i;void* ThreadA(void* args);void* ThreadB(void* args);int main(int argc, const char * argv[]) { int i1 = pthread_create(&A, NULL, ThreadA, NULL); int i2 = pthread_create(&B, NULL, ThreadB, NULL); if(i1 != 0){ printf("ERROR:%d,%d",i1,i2); } pthread_exit( NULL );//等待线程结束后在结束进程}void* ThreadA(void* args){ for(i =1 ;i<=10;i++){ sleep(0.3); printf("%d\n",i); } return NULL;}void* ThreadB(void* args){ while (i<=5) { pthread_yield_np();//如果i<=5即放弃本轮争用 } printf("ThreadBIsRunning\n"); return NULL;}
输出
1
2
3
4
5
ThreadBIsRunning
6
7
8
9
10
参考:
《现代操作系统》Andrew S.Tanenbaum著
- 多线程pthread_t
- pthread_t
- pthread_t
- pthread_t definition
- 打印pthread_t
- pthread_t结构的定义
- type pthread_t / pthread_create()
- pthread_detach(pthread_t thread)
- pthread_t 线程id为负数的原因
- gps hal用到的函数3--pthread_t
- iOS-pthread_t自定义一个简单线程
- pthread_t http://baike.baidu.com/link?url=RqlQDsuzwglrupfhdmk8nqPkvLSsdSPArFVn9k2nZitvJroW313ALYlsM
- pthread_exit(void *rval_ptr)和pthread_join(pthread_t thread, void **rval_ptr)
- 线程,如何通过pthread_t这个线程id判断线程是否已经终止
- error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)
- TFS安装:base_packet.cpp:246: 错误:从类型‘const char*’到类型‘pthread_t’的转换无效
- 多线程
- 多线程
- SVM基本原理(通俗易懂版)
- 如何用android sharedpreferences保存List集合
- Tomcat优化
- BSS Block Started by Symbol segment
- 文件上传1
- 多线程pthread_t
- struts2输入验证-java.io.FileNotFoundException: http://www.opensymphony.com/xwork/xwork-validator-1.0.2.d
- Windows和Linux上,java启动类库加载命令
- 关于IP 0.0.0.0
- 深度学习
- Node.js 究竟是什么?
- rfc5766
- 求1+2+3+...+n
- 耐人寻味的Temp文件(二)