在餐饮哲学家的算法中将信息传递给多个线程

时间:2014-11-21 03:17:50

标签: c pthreads dining-philosopher

我正在尝试创建多个线程,并为每个线程传递一个不同的值,用于餐饮哲学家的问题。但是我收到了这个错误:

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
}

1 个答案:

答案 0 :(得分:0)

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

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

  1. 声明一个每个线程都有一个条目的数组
  2. 初始化每个线程的数组条目
  3. 将数组条目传递给线程
  4. 在线程启动时从数组中检索信息
  5. 在下面的示例代码中,我们希望将单个整数传递给每个线程,因此该数组只是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 );
    }