pthread 陷阱

简单的一个插入排序过程初级版本.
错误版本
void *InsArray(void *args)
{
    SLink *slist=((void **)args)[0];
    int *array=((void **)args)[1];
    int *n=((void **)args)[2];
    pthread_mutex_t *mutex=((void **)args)[3];
    int *myid=((void **)args)[4];
    int i;
    printf("pthread_self  %d, addr in passing parameters %d\n",pthread_self(),start);
    for(i=0;i< *n; i++)
    {   
        pthread_mutex_lock(mutex);
        printf("myid %d\n",pthread_self()%10);
        InsElem(slist, array[i]);
        printf("-----------------------------------------------------\n");
        DispList(slist);
        printf("\n");
        printf("-----------------------------------------------------\n");
        pthread_mutex_unlock(mutex);
    }   
}
void **args=(void*)malloc(sizeof(void *)*5);
    for(i=0;i<N;i++)
    {
        int myid=i;
  //  void *args[5]={slist,array+n*i,&n,mutex,&myid};
            args[0]=slist;
            j=n*i;
            args[1]=&j;
            //args[1]=array+n*i;
            args[2]=&n;
            args[3]=mutex;
            args[4]=&myid;
//    InsArray(args);
    printf("addr before passing parameters %d\n",args[1]);
    pthread_create(&tid[i],NULL,InsArray,args);
    printf("%d\t addr after passing parameters %d\n",tid[i], args[1]);
    }


正确版本

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //#include <sys/types.h>
  4. #define ElemType int
  5. #define N 5
  6. typedef struct node
  7. {
  8.     ElemType data;
  9.     struct node *next;
  10. }SLink;

  11. // basic operation on single link list
  12. void InitList(SLink **sl)
  13. {
  14.     SLink *list;
  15.     list=(SLink*)malloc(sizeof(SLink)); // create head node
  16.  // list->next=NULL;
  17.     list->data=-1; //smallest
  18.     *sl=list;
  19. }

  20. // insert a node

  21. int InsElem(SLink *sl ,ElemType x)
  22. {
  23.     SLink *curr;
  24.     SLink *pre=sl;
  25.     curr=pre->next;
  26.     while(curr!=NULL && x > curr->data )
  27.     {
  28.         pre=curr;
  29.         curr=pre->next;
  30.     }
  31.     if(curr !=NULL && x== curr->data) /// ! curr is not null and ...
  32.     {
  33.         printf(" %d has already in\n", x);
  34.         return -1;
  35.     }
  36.     else
  37.     {
  38.         SLink *s;
  39.         s=(SLink*)malloc(sizeof(SLink)); // create node s
  40.         s->data=x;
  41.         s->next=NULL;
  42.         s->next=curr;
  43.        pre->next=s;
  44.         return 0;
  45.     }
  46. }

  47. int DelElem(SLink *sl,int data)
  48. {
  49.     SLink *curr;
  50.     SLink *pre=sl;
  51.     curr=pre->next;
  52.     while(curr!=NULL && data > curr->data )
  53.     {
  54.         pre=curr;
  55.         curr=pre->next;
  56.     }
  57.     if(curr!=NULL && data == curr->data)
  58.     {
  59.         pre->next=curr->next;
  60.         return 0;
  61.     }
  62.     else
  63.     {
  64.         printf(" %d does not exist\n", data);
  65.         return -1;
  66.     }

  67. }
  68. void DispList(SLink *sl)
  69. {
  70.     SLink *p=sl->next;
  71.     while(p!=NULL)
  72.     {
  73.         printf("%d\t",p->data);
  74.         p=p->next;
  75.     }
  76.     printf("\n");
  77. }

  78. void *InsArray(void *args)
  79. {
  80.     SLink *slist=((void **)args)[0];
  81.     int *array=((void **)args)[1];
  82.     int *n=((void **)args)[2];
  83.     pthread_mutex_t *mutex=((void **)args)[3];
  84.     int *myid=((void **)args)[4];
  85.     int i;
  86.     printf("pthread_self  %d, addr in passing parameters %d\n",pthread_self(),((void **)args)[1]);
  87.     for(i=0;i< *n; i++)
  88.     {
  89.         pthread_mutex_lock(mutex);
  90.         printf("myid %d\n",pthread_self()%10);
  91.         InsElem(slist, array[i]);
  92.         //printf("-----------------------------------------------------\n");
  93.         DispList(slist);
  94.         //printf("\n");
  95.         //printf("-----------------------------------------------------\n");
  96.         pthread_mutex_unlock(mutex);

  97.     }
  98. }
  99. int main()

  100. {
  101.     SLink *slist;
  102.     int i;
  103.     int a[5]={0,9,2,6,4};
  104.     SLink *lis;
  105.     InitList(&slist);
  106.     pthread_t  tid[N];
  107.     int n=10;
  108.     int *array=(int *)malloc(sizeof(int)*n*5);
  109.     srand(13);
  110.     for(i=0;i<n*N;i++)
  111.         array[i]=rand()%8191;
  112.     int j;
  113.     for(i=0;i<N;i++)
  114.     {
  115.         for(j=0;j<n;j++)
  116.         printf("%d\t",array[i*n+j]);
  117.         printf("\n");
  118.     }
  119.     printf("-----------------------------------------------------\n");

  120.     pthread_mutex_t *mutex=(pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
  121.     pthread_mutex_init(mutex,NULL);
  122.     void ***args=(void*)malloc(sizeof(void **)*5);
  123.     for(i=0;i<5;i++)
  124.         args[i]=(void *)malloc(sizeof(void *)*5);
  125.     for(i=0;i<N;i++)
  126.     {
  127.         int myid=i;
  128.         args[i][0]=slist;
  129.         args[i][1]=array+n*i;
  130.         args[i][2]=&n;
  131.         args[i][3]=mutex;
  132.         args[i][4]=&myid;
  133.         //printf("addr before passing parameters %d\n",args[i][1]);
  134.        pthread_create(&tid[i],NULL,InsArray,args[i]);
  135.         //printf("%d\t addr after passing parameters %d\n",tid[i], args[i][1]);
  136.     }
  137.     for(i=0;i<N;i++)
  138.         pthread_join(tid[i],NULL);
  139.     DispList(slist);
  140.     pthread_mutex_destroy(mutex);
  141.     return 0;
  142. }

原因create时,参数要分别申请空间,不能共用一个args


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值