gpt4 book ai didi

c - 为什么我创建的线程没有按顺序打印?

转载 作者:太空宇宙 更新时间:2023-11-04 05:48:18 25 4
gpt4 key购买 nike

我有这个程序:

void *func(void *arg) {
pthread_mutex_lock(&mutex);
int *id = (int *)arg;

printf("My ID is %d\n" , *id);
pthread_mutex_unlock(&mutex);
}

int main() {
int i;
pthread_t tid[3];

// Let us create three threads
for (i = 0; i < 3; i++) {
pthread_create(&tid[i], NULL, func, (void *)&i);
}

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

pthread_exit(NULL);
return 0;
}

我希望它输出这个:

My ID is 0
My ID is 1
My ID is 2

但我得到的是随机输出,例如:

My ID is 0
My ID is 0
My ID is 2

由于我已经添加了互斥锁,所以我认为它可以解决问题。我还做错了什么?这与竞争条件有关吗?

最佳答案

这里的 id 指向所有线程的 main 中的同一个变量 i

int *id = (int *)arg;

printf("My ID is %d\n" , *id);

但是变量 i 不断地被线程后面的 main 中的两个 for 循环更新。因此,在线程到达 printf 点之前,i 的值以及 *id 的值可能已更改。

有几种方法可以解决这个问题。最佳方法取决于用例:

  1. main 中等待,直到线程发出信号表明它已经复制了 *id,然后再修改 i 或让它超出范围.
  2. 声明并初始化一个数组 int thread_id[],然后像这样创建线程:pthread_create(&tid[i], NULL, func, &thread_id[i]);
  3. malloc 一些内存并用 i 的副本初始化它:

    int *thread_id = malloc(sizeof(*thread_id));
    *thread_id = i
    pthread_create(&tid[i], NULL, func, thread_id);

    只是不要忘记在您使用完线程后释放您的内存。或者在 main 中,如果线程无法启动。

  4. 如果 i 适合 void * 可以将其内容作为参数直接传递给线程。为确保它适合,您可以将其声明为 intptr_t 而不是 int(我们基本上滥用了指针不过是魔法整数这一事实):

    void *func(void *arg) {
    pthread_mutex_lock(&mutex);
    // Here we interpret a pointer value as an integer value
    intptr_t id = (intptr_t )arg;

    printf("My ID is %d\n" , (int)id);
    pthread_mutex_unlock(&mutex);
    }

    int main() {
    intptr_t i;
    pthread_t tid[3];

    // Let us create three threads
    for (i = 0; i < 3; i++) {
    // Here we squeeze the integer value of `i` into something that is
    // supposed to hold a pointer
    pthread_create(&tid[i], NULL, func, (void *)i);
    }

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

    // This does not belong here !!
    // pthread_exit(NULL);
    return 0;
    }

关于c - 为什么我创建的线程没有按顺序打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53490737/

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