我试图创建一个必须创建一系列pthread的函数。我试图通过为每个线程分配一个唯一的int来跟踪每个线程。但是,当我尝试创建多个线程时,每次在main函数中递增时,t的值都会改变。它应该通过值传递,为什么它会改变?
// Struct //
typedef struct threadArg {
int verbose;
int listSize;
int thread;
int (*list)[];
} threadArg;
// In main //
for(t=0; t < numThreads; t++){
printf("Creating thread %ld...\n", t);
struct threadArg arg = {
.verbose = verbose,
.list = &arr,
.listSize = size,
.thread = t
};
printf("t: %d\n", (arg.thread));
status = pthread_create(&threadID[t], NULL, threadSort, (void*)&arg);
if (status){
printf("ERROR: failed to create thread", t);
exit(-1);
}
}
// Thread Sort function //
void *threadSort(void* arguments) {
// *** Bubble Sort ***
threadArg* arg = (threadArg*) arguments;
int verbose = arg->verbose;
int size = arg->listSize;
int (*arr)[size] = arg->list;
int t = arg->thread;
if (verbose & INIT) { printf("Thread %d initalized!\n", t); }
}
感谢您的帮助, 沃利
答案 0 :(得分:0)
它应该通过值
不,这一行通过&#34;传递&#34;,传递arg
的地址:
status = pthread_create(&threadID[t], NULL, threadSort, (void*)&arg)
代码中的arg
实例将在循环的每次迭代中被使用和销毁并重新创建。
要修复此修改,您需要编写如下代码:
void * threadSort(void * arguments);
[...]
struct threadArg arg = {
.verbose = verbose,
.list = &arr,
.listSize = size,
.thread = 0,
};
struct threadArg args[t] = {0};
for(t=0; t < numThreads; t++)
{
printf("Creating thread %ld...\n", t);
args[t] = arg;
args[t].thread = t;
printf("t: %d\n", arg.thread);
status = pthread_create(threadID + t, NULL, threadSort, args + t);
[...]
这引入了一个struct arg
数组,其中包含每个sperate线程的元素,由threadArg
的值进行硝化,这在其他地方没有使用,但是传递了whag的常见初始化线程功能。