pthread系统调用

1. 创建线程

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;
}


输出结果: 




……

2.向线程传递参数

#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;
}



输出 









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;
}


输出 









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;
}


输出 





ThreadBIsRunning 




10
 

posted @ 2022-08-25 16:07  車輪の唄  阅读(29)  评论(0编辑  收藏  举报  来源