gpt4 book ai didi

c - 在哲学家就餐算法中将信息传递给多个线程

转载 作者:行者123 更新时间:2023-11-30 17:25:32 25 4
gpt4 key购买 nike

我正在尝试创建多个线程,并将不同的值传递给每个线程来解决哲学家就餐的问题。但我收到此错误:

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
}

最佳答案

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

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

  1. 声明一个数组,每个线程都有一个条目
  2. 初始化每个线程的数组条目
  3. 将数组条目传递给线程
  4. 线程启动时从数组中检索信息

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

代码启动了五个线程。每个线程都会传递一个唯一的 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 );
}

关于c - 在哲学家就餐算法中将信息传递给多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27053541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com