多线程编程——pthread

Posted ^_^|

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程编程——pthread相关的知识,希望对你有一定的参考价值。

1 创建线程

1.1 原型

#include <pthread.h>

int pthread_create(pthread_t *tid, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

1.2 功能

创建一个线程
新线程从start_routine开始执行
新线程的ID保存在tid指向的位置

1.3 参数

参数功能
tid该参数是一个指针, 新线程的ID保存在tid指向的位置
attr线程属性。如果为空,则使用缺省的属性值
start_routine该参数是一个函数指针, 新线程从start_routine开始执行

1.4 返回值

如果成功,返回0
如果失败,返回非0

1.5 例子

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

// int pthread_create(pthread_t *tid, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
void *compute(void *arg)
{
    char i;
    for (i = 'a'; i < 'd'; i++) {
        printf("worker: %c\\n", i);
        sleep(1);
    }
    return NULL;
}

int main()
{ 
    pthread_t worker_tid;
    pthread_create(&worker_tid, NULL, &compute, NULL);

    char i;
    for (i = 'A'; i < 'D'; i++) { 
        printf("master: %c\\n", i);
        sleep(1);
    }
    return 0;
}

2 参数类型

参数类型
可以向线程入口函数传递任意类型的参数
整型变量
long ivalue = 123;
void *arg = (void *) ivalue;
pthread_create(&tid, NULL, start_routine, arg);

字符串变量
char *svalue = "string";
void *arg = (void *) svalue;
pthread_create(&tid, NULL, start_routine, arg);

结构体变量,只能传递结构体的地址
struct person {
    char *name; 
    int age;
} p;
void *arg = (void *) &p;
pthread_create(&tid, NULL, start_routine, arg);

2.1 传int类型

  1. 进行相应的类型转换

int类型转换到void*存在size不一样的问题

pthread_create(&worker_tid, NULL, &compute2, (void *)100);

在这里插入图片描述
解决:用lnog int 类型
pthread_create(&worker_tid, NULL, &compute2, (void *)(long int)100);

void *compute2(void *arg)
{
        long num = (long int)arg;
        int i;
        for (i = 0; i < 3; i ++)
        {
                printf("i=%d, num=%ld\\n", i, num);
                sleep(1);
        }
        return NULL;
}


int main()
{
        long ivalue = 100;
        pthread_t worker_tid;
//      pthread_create(&worker_tid, NULL, &compute, "worker");
        pthread_create(&worker_tid, NULL, &compute2, (void *)ivalue);
        compute2((void*)(long int)(200));
        return 0;
}

将ivalue定义为long 类型,注意: long类型强制类型转换需要用(long int)

  1. 或者传指针
void *compute3(void *arg)
{
        int *num = (int *)arg;
        int i;
        for (i = 0; i < 3; i ++)
        {
                printf("i=%d, num=%d\\n", i, *num);
                sleep(1);
        }
        return NULL;
}

int main()
{
        long ivalue = 100;
        pthread_t worker_tid;
//      pthread_create(&worker_tid, NULL, &compute, "worker");
//      pthread_create(&worker_tid, NULL, &compute2, (void *)ivalue);
        pthread_create(&worker_tid, NULL, &compute3, (void *)&ivalue);
        compute2((void*)(long int)(200));
        return 0;

3 等待线程

3.1等待线程

3.1.1原型

#include <pthread.h>

int pthread_join(pthread_t tid, void **result);

3.1.2 功能

等待线程结束

3.1.3 参数

tid 目标线程的ID
result 用于存放线程的计算结果

3.1.4 返回值

如果成功,返回0
如果失败,返回非0

3.2 线程返回值

线程入口函数返回类型为void **类型的结果
void *start_routine(void *arg)
{
    void *result;
    ...
    return result;
}

等待线程函数pthread_join获取线程的返回结果
void *result;
pthread_join(tid, &result);

以上是关于多线程编程——pthread的主要内容,如果未能解决你的问题,请参考以下文章

多线程编程

C 语言编程 — pthread 线程操作

Linux——多线程编程

什么是Java多线程编程?

为什么对多线程编程这么怕?pthread,sem,mutex,process

c++多线程同时运行两个函数该怎样编程啊?