一、pthread_create函数:
函数声明:
int pthread_create(pthread_t* restrict tidp,const pthread_attr_t* restrict_attr,
void* (*start_rtn)(void*),void *restrict arg);
输入参数:
(1)tidp:事先创建好的pthread_t类型的参数。成功时tidp指向的内存单元被设置为新创建线程的线程ID。
(2)attr:用于定制各种不同的线程属性。APUE的12.3节讨论了线程属性。通常直接设为NULL。
(3)start_rtn:新创建线程从此函数开始运行。无参数是arg设为NULL即可。
(4)arg:start_rtn函数的参数。无参数时设为NULL即可。有参数时输入参数的地址。当多于一个参数时应当使用结构体传入。(以下举例)
5、返回值:成功返回0,否则返回错误码。
举例如下:
//在第一个参数中指定进程的 ID。
//第二个参数直接设置为NULL。
//第三个参数设置对应的函数名。
//第四个不需要参数并设置为NULL。
if(pthread_create(&rowtid, NULL, check_rows, NULL) != 0){
perror("thread create error : check sudoku's rows\n");
exit(1);
}
if(pthread_create(&coltid, NULL, check_columns, NULL) != 0){
perror("thread create error : check sudoku's columns\n");
exit(1);
}
for(i=0; i<9; i++){
gid[i]=i;
if(pthread_create(subgridtid+i, NULL, check_subgrid, gid+i) != 0){
perror("thread create error : check sudoku's subgrid\n");
exit(1);
}
}
二、pthread_join函数:
函数声明:
int pthread_join(pthread_t thread, void ** retval);
输入参数:
1.thread 参数用于指定接收哪个线程的返回值;
2.retval 参数表示接收到的返回值,如果 thread 线程没有返回值,又或者我们不需要接收 thread 线程的返回值,可以将 retval 参数置为 NULL。
pthread_join() 函数会一直阻塞调用它的线程,直至目标线程执行结束(接收到目标线程的返回值),阻塞状态才会解除。如果 pthread_join() 函数成功等到了目标线程执行结束(成功获取到目标线程的返回值),返回值为数字 0;反之如果执行失败,函数会根据失败原因返回相应的非零值,每个非零值都对应着不同的宏。
举例如下:
//这是检查数独横、纵、九宫格的代码段
//将每个进程添加到其位置。 我们需要使用循环添加 9 个网格。
pthread_join(rowtid, NULL);
pthread_join(coltid, NULL);
for(i=0; i<9; i++){
pthread_join(subgridtid[i], NULL);
}