gpt4 book ai didi

c - pthreads:Linux 上 gcc 和 icc 之间的不一致

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:50 27 4
gpt4 key购买 nike

以下代码在 gcc (4.1.2 20080704) 中产生错误且不一致的输出,但在 icc(版本 11.1)中产生正确且符合预期的输出。但是当我将 thread_data_array[] 定义从 main() 移动到全局(紧接在 struct thread_data 定义之后)时,它适用于两个编译器。我不明白为什么这种变化会产生任何影响。我想递归地生成线程,所以我需要从函数中调用它而不是定义为全局的。有人可以解释一下代码有什么问题吗?

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

#define NUM_THREADS 4

struct thread_data {
int thread_id;
int sum;
};

/* struct thread_data thread_data_array[NUM_THREADS]; */

void *p_task(void *threadarg)
{
struct thread_data *my_data;
int taskid;
int sum;

my_data = (struct thread_data *) threadarg;
taskid = my_data->thread_id;
sum = my_data->sum;

printf("Thread #%d with sum %d\n", taskid, sum);

for ( sum = 0; sum < 000000000; sum++ ) {
for ( taskid = 0; taskid < 000000000; taskid++ ) {
sum+=taskid;
}
}

return my_data;
}

int main ()
{
struct thread_data thread_data_array[NUM_THREADS]; /*this does not work*/

pthread_t threads[NUM_THREADS];
int rc;
long t;

for ( t = 0; t < NUM_THREADS; t++ ) {
thread_data_array[t].thread_id = t;
thread_data_array[t].sum = (int) t*2;
rc = pthread_create( &threads[t], NULL, p_task, (void *) &thread_data_array[t] );
}

pthread_exit(NULL);

return 0;

}

最佳答案

嗯,我的第一个想法是主线程实际上正在退出,并在其他线程完成之前带走它的堆栈帧。根据我对 pthreads 的内存(这是十五年前的事情,将它们与 DCE 一起使用),除了堆栈大小之外,主线程绝对没有什么特别之处。

如果数组声明为全局数组,main 的退出将不会对其产生任何影响,但是,如果它在 main 的堆栈帧中,我会非常退出后小心使用。

我部分基于猜测,因为您实际上没有解释您所看到的行为是什么。

我建议在 main 中的 pthread_exit 之前插入以下代码:

for (t = 0; t < NUM_THREADS; t++ )
pthread_join (threads[t], NULL);

关于c - pthreads:Linux 上 gcc 和 icc 之间的不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1686031/

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