2

我想运行 4 个不同的线程调用相同的方法,并且我想确保每次运行都来自不同的运行线程。

使用下面提供的代码,方法函数运行了预期的次数,但它总是由同一个线程完成(打印的值不会改变)。

我应该在代码中更改什么以确保这种情况?(这将导致此示例打印 4 个不同的值)

编辑:相同的代码,但包括一个结构来查看解决方案将如何

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

struct object{
  int id;
};

void * function(void * data){

    printf("Im thread number %i\n",     data->id);
    pthread_exit(NULL);

}

int main(int argc, char ** argv){

    int i;
    int error;
    int status;
    int number_threads = 4;

    pthread_t thread[number_threads];

    struct object info;

    for (i = 0; i < number_threads; ++i){

        info.id = i;

        error = pthread_create(&thread[i], NULL, function, &info);

        if(error){return (-1);}
    }

    for(i = 0; i < number_threads; i++) {

        error = pthread_join(thread[i], (void **)&status);

        if(error){return (-1);}   
    }

}
4

3 回答 3

2

您总是看到相同值的原因

您正在将指针打印为整数。data指向你的i变量main。的地址i不会改变,因此打印的值相同。

打印值i

您想要做的是取消引用data作为整数。正确的方法很简单:*(int *)data. 这意味着data将指针转换为整数,然后取消引用以检索值。


我应该在代码中更改什么以确保这种情况?(这将导致此示例打印 4 个不同的值)

打印 的值i 并不能保证会打印 4 个不同的值。

  • 在所有 4 个线程都被创建并且主要线程正在等待之前,调度程序不会运行您的线程是完全合理的join()。在这种情况下,所有线程都会打印0.

  • 线程 1 和 2 读取i = 2和 3 和 4 读取是可能的i = 3。或其他一些组合。

如何确保打印不同的值

要正确执行此操作,您需要将不同的参数传递给每个线程。最干净的应该是这样的。

int thread_number[4] = {0, 1, 2, 3};
// ...
error = pthread_create(&thread[i], NULL, function, &thread_number[i]);
于 2015-04-30T22:22:09.353 回答
1

尝试修改

printf("Im thread number %i\n", data);

printf("Im thread number %i\n", *((int *)data));
于 2015-04-30T22:19:47.797 回答
1

您正在将地址传递i给所有 4 个线程,这不是您想要的,它会导致竞争条件。如果您只是想传递的值i并由所有线程打印它们,则传递为:

error = pthread_create(&thread[i], NULL, function, (void *)i);

并将打印行更改为:

printf("Im thread number %i\n", (int)data);
于 2015-04-30T22:20:37.680 回答