gpt4 book ai didi

c - pthreads 程序表现不佳

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:59:13 25 4
gpt4 key购买 nike

我正在尝试使用 pthreads 制作一个简单的程序,想要制作 6 个线程并将索引传递给所有线程。这是代码:

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

#define num_students 6

void thread_starter();

int main() {
pthread_t thread1[num_students];

int i = 0;
for(i = 0; i<num_students; i++) {
int q = i;
pthread_create(&thread1[i], NULL, (void *) &thread_starter, (void *)&q);
}
sleep(1);
}


void thread_starter(void* a) {
printf("Thread %i \n", *((int*)a));
}

输出:

Thread 2
Thread 3
Thread 2
Thread 4
Thread 5
Thread 5

为什么他们有共同的名字?怎么了?

谢谢

最佳答案

您正在将堆栈地址从主线程传递到所有子线程。无法保证何时安排这些线程,因此您无法知道主线程是否会在每个子线程开始读取它时更新其堆栈变量。

为避免这种情况,您需要为传递给每个线程的数据分配内存。

在您的示例中执行此操作的最简单方法是使用另一个自动变量来存储传递给新线程的数据

void thread_starter(void* a);
int main() {
pthread_t thread1[num_students];
int thread_data[num_students];
int i = 0;
for(i = 0; i<num_students; i++) {
thread_data[i] = i;
pthread_create(&thread1[i], NULL, thread_starter, &thread_data[i]);
}
sleep(1);
}

另请注意,如果您在前向声明中为其提供正确的签名,则可以避免强制转换 thread_starter

对于更复杂的程序,您可能需要为每个线程动态分配内存,将内存的所有权传递给新线程。

int main() {
pthread_t thread1[num_students];
int i = 0;
for(i = 0; i<num_students; i++) {
int* data = malloc(sizeof(*data));
*data = i;
pthread_create(&thread1[i], NULL, thread_starter, data);
}
sleep(1);
}

void thread_starter(void* a) {
printf("Thread %i \n", *((int*)a));
free(a);
}

最后,使用 sleep(1) 并不是确保所有线程都运行的非常严格的方法。最好用pthread_join相反

for(i = 0; i<num_students; i++) {
pthread_join(thread1[i], NULL);
}

关于c - pthreads 程序表现不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20759763/

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