2014-11-21 59 views
0

我正在尝试创建多个线程并为餐饮哲学家的问题传递不同的值给每个线程。但我收到此错误:在餐饮哲学家的算法中将信息传递给多个线程

warning: cast to pointer from integer of different size 

这里是我的代码:

pthread_mutex_t mutex; 
pthread_cond_t cond_var; 
pthread_t philo[NUM]; 

int main(void) 
{ 
    int i; 
    pthread_mutex_init (&mutex, NULL); 
    pthread_cond_init (&cond_var, NULL); 

    //Create a thread for each philosopher 
    for (i = 0; i < NUM; i++) 
     pthread_create (&philo[i], NULL,(void *)philosopher,(void *)i); // <-- error here 

    //Wait for the threads to exit 
    for (i = 0; i < NUM; i++) 
     pthread_join (philo[i], NULL); 

    return 0; 
} 

void *philosopher (void *num) 
{ 
    //some code 
} 
+2

pthread_create()需要一个指针而不是int。 – 2501 2014-11-21 03:19:55

+0

我改变了pthread_create(&philo [i],NULL,(void *)philosopher,(void *)i);到pthread_create(&philo [i],NULL,(void *)philosopher,(int *)i);仍然没有工作..... – user1435077 2014-11-21 03:36:47

+0

你为什么将'philosopher'投给'void *'?这是错误的类型。 – 2014-11-21 03:44:09

回答

0

警告仅仅是意味着int不一定是大小在所有平台上的指针一样。为避免此警告,您可以声明iintptr_t。一个intptr_t保证与指针大小相同。但请允许我建议一种替代解决方案。

下面的代码演示了如何在向每个线程传递唯一信息时启动多个线程。这些步骤是

  1. 声明具有为每个线程
  2. 初始化为每个线程
  3. 阵列条目传递给线程
  4. 阵列条目检索来自所述阵列中的信息的一个条目的阵列,当线程启动

在下面的示例代码中,我们希望将一个整数传递给每个线程,因此该数组只是一个数组int。如果每个线程需要更多信息,则可以使用一组struct s。

该代码启动五个线程。每个线程都会传递一个唯一的ID(0到4之间的一个int),并在短暂延迟后将其打印到控制台。延迟的目的是证明线程将获得唯一的ID,而不管它们何时开始。

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

#define NUM 5 
static int infoArray[NUM]; // 1. declare an array with one entry for each thread 

void *philosopher(void *arg); 

int main(void) 
{ 
    int i; 
    pthread_t threadID[NUM]; 

    srand(time(NULL)); 

    for (i = 0; i < NUM; i++) 
    { 
     infoArray[i] = i;  // 2. initialize the array entry for this thread 

     // 3. pass the array entry to the thread 
     if (pthread_create(&threadID[i], NULL, philosopher, (void *)&infoArray[i]) != 0) 
     { 
      printf("Bad pthread_create\n"); 
      exit(1); 
     } 
    } 

    for (i = 0; i < NUM; i++) 
     pthread_join(threadID[i], NULL); 

    return(0); 
} 

void *philosopher(void *arg) 
{ 
    sleep(rand() % 3); 

    int id = *(int *)arg; // 4. retrieve the information from the array 
    printf("%d\n", id); 

    return(NULL); 
}