在for循环中将结构传递给pthread的正确方法

时间:2015-01-29 00:37:27

标签: c++ multithreading struct pthreads

1。问题:我需要将包含两个整数的结构传递给pthread_create调用。

这是在for循环中计算结构的值。理想情况下,我希望每个线程使用不同的结构调用updatePlates()。

2。问题:我创建了结构{1,2},{3,4},{5,6},但是当线程开始工作时,它们都具有值{5,6}。我的不正确的理解Tuple t;是每个循环迭代的新临时变量。但我的调试语句cout<< "t: " << &t << endl;显示它们每个循环都有相同的内存地址。

第3。真实问题:创建“新”结构并将其传递给具有唯一非共享值的每个线程的正确方法是什么?

pthread_t updateThreads[THREADS];
for(size_t i = 0; i < THREADS; ++i)
{
    Tuple t;
    t.start = 1 + (i * increment);
    t.end = t.start + increment -1;
    // Debug Statements //
    cout << "start: " << t.start <<endl;
    cout << "end:   " << t.end <<endl;
    cout << "t:     " << &t <<endl;
    // End Debug //
    returnCode = pthread_create(&updateThreads[i], NULL, updatePlates, (void *)&t);
}
for(size_t i = 0; i < THREADS; ++i)
{
    pthread_join(updateThreads[i], NULL);
}

1 个答案:

答案 0 :(得分:3)

在堆上分配它们

Tuple* t = new Tuple;

分配值

t->start = 1 + (i * increment);
t->end = t->start + increment -1;

传递给pthread_create

returnCode = pthread_create(&updateThreads[i], NULL, updatePlates, (void *)t);

然后在updatePlates释放元组。

void* updatePlates(void* data)
{
    Tuple* t = (Tuple*)data;

    // do stuff

    delete t;
    return NULL;
}

或者你知道你有多少个线程,你可以定义一个Tuple的数组,并将索引传递给数组到pthread_create调用。但请确保该数组在线程函数的生命周期内保持在范围内。