多线程pthread_t

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

  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值