27.1 线程创建
#include <assert.h>
#include <stdio.h>
#include <pthread.h>
typedef struct {
int a;
int b;
} myarg_t;
void *mythread(void *arg) {
myarg_t *args = (myarg_t *) arg;
printf("%d %d\n", args->a, args->b);
return NULL;
}
int main(int argc, char *argv[]) {
pthread_t p;
myarg_t args = { 10, 20 };
int rc = pthread_create(&p, NULL, mythread, &args);
assert(rc == 0);
(void) pthread_join(p, NULL);
printf("done\n");
return 0;
}
27.2 线程完成
如果你想等待线程完成,会发生什么情况?你需要做一些特别的事情来等待完成。具体来说,你必须调用函数 pthread_join() 。
- 第一个是 pthread_t 类型,用于指定要等待的线程。
- 第二个参数是一个指针,指向你希望得到的返回值
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include "common_threads.h"
typedef struct {
int a;
int b;
} myarg_t;
typedef struct {
int x;
int y;
} myret_t;
void *mythread(void *arg) {
myarg_t *args = (myarg_t *) arg;
printf("args %d %d\n", args->a, args->b);
myret_t *rvals = malloc(sizeof(myret_t));
assert(rvals != NULL);
rvals->x = 1;
rvals->y = 2;
return (void *) rvals;
}
int main(int argc, char *argv[]) {
pthread_t p;
myret_t *rvals;
myarg_t args = { 10, 20 };
Pthread_create(&p, NULL, mythread, &args);
Pthread_join(p, (void **) &rvals);
printf("returned %d %d\n", rvals->x, rvals->y);
free(rvals);
return 0;
}
27.3 锁
除了线程创建和 join 之外, POSIX 线程库提供的最有用的函数集,可能是通过锁(lock)来提供互斥进入临界区的那些函数。这方面最基本的一对函数是:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
27.4 条件变量
所有线程库还有一个主要组件(当然 POSIX 线程也是如此),就是存在一个条件变量(condition variable)。当线程之间必须发生某种信号时,如果一个线程在等待另一个线程继续执行某些操作,条件变量就很有用。希望以这种方式进行交互的程序使用两个主要函数:
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_signal(pthread_cond_t *cond);
|