多线程之pthread_create()和pthread_join()

一、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);

}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值