加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX环境高级编程:pthread_create的问题

发布时间:2016-10-03 06:35:27 所属栏目:Unix 来源:站长网
导读:副标题#e# linux 下常用的创建多线程函数pthread_create(pthread_t * thread , pthread_attr_t * attr , void *(*start_routine)(void*) , void *args); 其中第一个参数用来保存线程信息,第二个参数指新线程的运行属性,可以设置为NULL,第三个参数为自定

看到这个结果有没有感觉到有什么不对呢?可能你会感觉到很纳闷,怎么出现了那么多的id=0的结果呢?其实这个认真分析一下并不难理解:

首先pthread_create函数传递的是一个指针型的参数,即传递的是一个地址而已,这样在执行for结构时:

for(int i=0; i<th_pop; i++)  
{  
        pthread_create(&a_thread[i] , NULL , thread_func , &i);  
}

该for循环快速执行完成,并且将i置为20,故而传递的地址指向的内容为20,同时其它的线程还没来得及执行: int t_id = *(int*)args;

查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/

这样就使得多个线程都指向同一个地址,内容为20,解决该问题的一个办法为中for结构中加入sleep(1),这样当sleep时间大于线程函数执行时间,就可以得到一个正确的结果,不过这种办法剥掉了并发性,并不可取,下面我们采用另一种方法。

我们只修改init()函数

#include <stdio.h>  
#include <stdlib.h>  
#include <pthread.h>  
      
      
#define th_pop 20 //  
      
pthread_mutex_t mutex;  
      
pthread_t a_thread[th_pop];  
      
      
void * thread_func(void *args)  
{  
    pthread_mutex_lock(&mutex);  
    int t_id = *(int*)args;  
    printf("the id of this thread is %dn",t_id);  
    pthread_mutex_unlock(&mutex);      
    return (void*)NULL;  
}  
      
void init()  
{  
    pthread_mutex_init(&mutex, NULL);  
    int thread_id[th_pop];  
    int i;  
    for( i=0; i<th_pop; i++)  
        thread_id[i] = i;  
    for( i=0; i<th_pop; i++)  
    {  
        int *t = thread_id +i;  
        pthread_create(&a_thread[i] , NULL , thread_func , (void*)t);  
    }  
    //wait the end of the threads;  
    for( i=0; i<th_pop; i++)  
    {  
        int res = pthread_join(a_thread[i] , NULL);  
        if(res != 0)  
            printf("the thread id: %d ends fail n",i);  
    }  
    pthread_mutex_destroy(&mutex);  
          
}  
      
int main()  
{  
    init();  
    return 0;  
}

运行结果:

huangcheng@ubuntu:~$ ./a.out
the id of this thread is 3  
the id of this thread is 2  
the id of this thread is 1  
the id of this thread is 4  
the id of this thread is 5  
the id of this thread is 6  
the id of this thread is 7  
the id of this thread is 8  
the id of this thread is 9  
the id of this thread is 10  
the id of this thread is 11  
the id of this thread is 12  
the id of this thread is 13  
the id of this thread is 14  
the id of this thread is 15  
the id of this thread is 16  
the id of this thread is 17  
the id of this thread is 18  
the id of this thread is 19  
the id of this thread is 0

从这个例子中我们应该明白,要避免直接在传递的参数中传递发生改变的量,否则会导致结果不可测。

解决这类问题的办法:

(1)复制一份到堆里面。
(2)加锁。(一般做法)
(3)用结构体数组。(推荐这个)
(4)sleep。(不推荐)

作者信息:csdn博客 ctthuangcheng

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读