从for循环传递线程一个值

时间:2018-10-09 02:35:50

标签: c multithreading loops

我正在尝试创建线程,并向每个线程传递for循环的值。这是代码段

pthread_t *threadIDs;
    int i = 0;
    if(impl == 1)
    {
        threadIDs = (pthread_t *)malloc(sizeof(pthread_t)*reduces);
        for(;i < reduces; i++)
        {
            pthread_create(&threadIDs[i], NULL, reduce,&i);
        }
    }

它没有传递正确的循环值,这是有道理的,因为我正在创建竞争条件。从循环中传递i的正确值的最简单方法是什么?

另一个问题,在创建和调用下一个线程之前,每个线程都会完成执行吗?

3 个答案:

答案 0 :(得分:1)

您已经动态创建了一个线程ID数组。对您要传递的值执行相同的操作。

pthread_t *threadIDs;
int *values;
int i = 0;
if(impl == 1)
{
    threadIDs = malloc(sizeof(pthread_t)*reduces);
    values = malloc(sizeof(int)*reduces);
    for(;i < reduces; i++)
    {
        values[i] = i;
        pthread_create(&threadIDs[i], NULL, reduce, &values[i]);
    }
}

每个线程将使用不同的数组成员,因此没有竞争条件。

答案 1 :(得分:1)

您可以定义结构并将i分配给对象的变量。

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

typedef struct Param_ {
    int index;
}Param;

static void* thread(void* p) {
    Param* param = p;
    printf("index: %d\n", param->index);
}

int main() {
    int i = 0;
    int reduces = 10;
    pthread_t *threadIDs;

    threadIDs = (pthread_t *)malloc(sizeof(pthread_t)*reduces);
    for(; i < reduces; i++)
    {
        Param* p;
        p = (Param*)malloc(sizeof(*p));
        p->index = i;
        pthread_create(&threadIDs[i], NULL, thread, p);
    }

    return 0;
}

答案 2 :(得分:1)

  

从循环中传递i的正确值的最简单方法是什么?

什么被视为“ 简单”取决于用例,因此这里提供了另一种解决您遇到的问题的方法:

#include <pthread.h>

pthread_mutex_t m_init;
pthread_cond_t c_init;

int init_done = 1;

void* thread_function(void * pv)
{
  pthread_mutex_lock(&m_init);

  size_t i = *((size_t*) pv);
  init_done = 1;

  pthread_cond_signal(&c_init);

  pthread_mutex_unlock(&m_init);

  ...
}

#define THREADS_MAX (42)

int main(void)
{
  pthread_t thread[THREADS_MAX];

  pthread_mutex_init(&m_init, NULL);
  pthread_cond_init(&c_init, NULL);

  for(size_t i = 0; i < THREADS_MAX; ++i)
  {
    pthread_mutex_lock(&m_init);

    init_done = 0;
    pthread_create(&thread[i], NULL, thread_function, &i);

    while (!init_done)
    {
      pthread_cond_wait(&c_init);
    }

    pthread_mutex_unlock(&m_init);
  }

  ...
}

(为清晰起见,省略了错误检查)