在 for 循环中将结构传递给 pthread 的正确方法
Correct way to pass a struct to pthread within a for loop
1.问题: 我需要将包含两个整数的结构传递给 pthread_create 调用。
这是在计算结构值的 for 循环中。理想情况下,我希望每个线程都使用不同的结构调用 updatePlates()。
2。问题: 我创建了结构体 {1,2},{3,4},{5,6} 但当线程开始工作时它们都具有值 {5,6}。我的 不正确 理解 Tuple t;
是每个循环迭代的新临时变量。但是我的调试语句 cout<< "t: " << &t << endl;
显示它们在每个循环中都具有相同的内存地址。
3。真正的问题: 创建 'new' 结构并将其传递给具有唯一非共享值的每个线程的正确方法是什么?
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);
}
在堆上分配它们
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
调用。但要确保数组在线程函数的生命周期内保持在范围内。
1.问题: 我需要将包含两个整数的结构传递给 pthread_create 调用。
这是在计算结构值的 for 循环中。理想情况下,我希望每个线程都使用不同的结构调用 updatePlates()。
2。问题: 我创建了结构体 {1,2},{3,4},{5,6} 但当线程开始工作时它们都具有值 {5,6}。我的 不正确 理解 Tuple t;
是每个循环迭代的新临时变量。但是我的调试语句 cout<< "t: " << &t << endl;
显示它们在每个循环中都具有相同的内存地址。
3。真正的问题: 创建 'new' 结构并将其传递给具有唯一非共享值的每个线程的正确方法是什么?
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);
}
在堆上分配它们
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
调用。但要确保数组在线程函数的生命周期内保持在范围内。