POSIX Pthread添加两个数字C代码

时间:2015-08-29 19:46:24

标签: c multithreading pthreads posix

我尝试使用下面的代码将指针传递给包含要添加的两个数字的数组

#include <stdio.h> 
#include <stdlib.h>  
#include <pthread.h>  

void *print_message_function( void *ptr );  

 main()  
 {  
      pthread_t thread1, thread2;  

      /*const char *message1 = "Thread 1";  

      const char *message2 = "Thread 2"; */

      int arr[2] = {5,8};
      const int *ptrtoarr;
      ptrtoarr=arr;

      int  iret1, iret2;  

     int *s=(int *)(ptrtoarr);
      printf("%d \n", *s); 
      ptrtoarr++;
      s=(int *)(ptrtoarr);
      printf("%d \n", *s); 
     ptrtoarr--;

     /* Create independent threads each of which will execute function */

    iret1 = pthread_create( &thread1, NULL, print_message_function,&arr);  

      if(iret1)  
      {  

          fprintf(stderr,"Error - pthread_create() return code: %d\n",iret1);  
          exit(EXIT_FAILURE);  
      }

    /*  iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);  

      if(iret2)      
      {  
          fprintf(stderr,"Error - pthread_create() return code: %d\n",iret2);  
          exit(EXIT_FAILURE);  
      }  */

      printf("pthread_create() for thread 1 returns: %d\n",iret1);  

     /* printf("pthread_create() for thread 2 returns: %d\n",iret2); */

      /* Wait till threads are complete before main continues. Unless we  */ 
      /* wait we run the risk of executing an exit which will terminate   */ 

      /* the process and all threads before the threads have completed.   */      
      pthread_join( thread1, NULL);  

      /* pthread_join( thread2, NULL); */  

      exit(EXIT_SUCCESS);  
 }  


 void *print_message_function( void *ptr )  
 {  
      /*char *message;  

      message = (char *) ptr;  

      printf("%s \n", message);  */
      printf("\n In message function \n");
      int *sum=(int *)(ptr);
      printf("%d \n", *sum); 
      sum = (int *)(ptr+1);
      printf("%d \n", *sum);


 } 

但是在包含添加步骤的函数print_message_function中,使用指针我可以访问第一个数字而不是第二个数字。

(它访问主要功能中的两个数字)

输出如下

5 8 线程1的pthread_create()返回:0

在留言功能中 五 134217728

2 个答案:

答案 0 :(得分:2)

下面,

sum = (int *)(ptr+1);

您正在对标准C中不允许的void *(空指针)执行指针运算。通过将其大小视为1,GCC允许在void *上进行指针运算。

应该是

  sum = (int *)ptr+1;

更简洁的方法是使用sum本身来获取下一个元素而不是ptr

void *print_message_function( void *ptr )
{
  printf("\n In message function \n");
  int *sum=ptr;
  printf("%d \n", *sum); 
  sum++;
  printf("%d \n", *sum);
  return NULL;
} 

我删除了转换,因为void *与任何数据指针兼容。所以演员阵容是不必要的,并添加return NULL;因为线程函数应返回void *或调用pthead_exit()

GCC有一个选项-Wpointer-arith来警告无效指针的指针算法。

答案 1 :(得分:0)

AnupW,

可能你的问题源于直接在你的线程函数中使用 ptr 。它是一个无效指针,所以你不知道你会得到什么。我会推荐你​​这个答案:

Concept of void pointer in C programming

特别是关于指针算术的答案。

尝试将 ptr 转换为类似于main(使用ptrtoarr)并使用它的int指针。