初次尝试 pthread

第一次尝试使用 pthread,希望对基本的常用函数的用法有个大致了解,能对这些函
数有个大致了解。

pthread 函数

1
2
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);

参数 thread 传入一个 pthread_t *,函数调用成功时该参数被设置为所创建线程
的 ID。参数 attr 保存创建线程时所需要的属性。参数 start_routine 为新线程创
建后会执行的函数。arg 会作为 start_routine 的参数传入。

pthread_create()的返回值表示错误码,成功时返回0

1
int pthread_join(pthread_t thread, void **retval);

pthread_join()等待一个线程结束,并回收其返回值到retval

1
pthread_t pthread_self(void);

pthread_self()用于获取当前线程的 ID。man pthread_self中说这个函数调用问
题成功,我也不清楚为什么。。。

RETURN VALUE
This function always succeeds, returning the calling thread’s ID.

例子

这个例子的作用是向线程传入两个数,在线程中相加后,返回其结果。因为只能传入
一个参数,所以使用了结构体。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

struct add_struct {
int addend1;
int addend2;
int sum;
};

static void *
thread_run(void * arg)
{
struct add_struct *s = (struct add_struct*) arg;
printf("child thread ID: %#lx\n", pthread_self());
s->sum = s->addend1 + s->addend2;
pthread_exit((void*)3);
/* return (void*)s; */
}

int main(int argc, char *argv[])
{
int err;
void *res;
pthread_t thread_id;
struct add_struct arg = {1,2,0};
printf("Before create: %#lx\n", thread_id);
err = pthread_create(&thread_id, 0, &thread_run, &arg);
printf("After create: %#lx\n", thread_id);
if (err) {
fprintf(stderr, "pthread_create error: %s\n", strerror(err));
exit(1);
}
printf("man thread ID: %#lx\n", pthread_self());
pthread_join(thread_id, &res);
printf("pthread_create succeed, sum: %d, return val: %d\n", arg.sum, (int)res);
return 0;
}

编译时需要加上-pthread选项,编译运行如下:

1
2
3
4
5
6
7
$ clang pthread.c -pthread
$ ./a.out
Before create: 0
After create: 0x7f97f1ae5700
man thread ID: 0x7f97f22be700
child thread ID: 0x7f97f1ae5700
pthread_create succeed, sum: 3, return val: 0

References

man pthread_create
man pthread_join
man pthread_exit
man pthread_self
man pthread_attr_init

0%