多线程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著

0 0
原创粉丝点击