对象在多线程中的行为
Behaviour of object in multithread
我试图使用boost::thread_group
来管理我的线程。该设计使得线程组中的每个线程调用结构体A
的一个函子序列。
伪代码:
struct A {
int n;
vector p;
void operator()() {
for(number_of_steps) // Do computations involving members n, p, x and y.
}
private:
float x;
vector y;
};
struct parallel_A : boost::thread_group {
parallel_A(const A* a) : m_a(a) {
for(number_of_cpu) {
create_thread(inner_struct(this));
}
}
void run() {
(*m_a)();
}
private:
struct inner_struct {
parallel_A* a;
inner_struct(parallel_A* _a) : a(_a) {}
void operator()() {
a->run();
}
}
const A* m_a;
}
我的问题是
数据变量
n
、p
、x
、y
与对象A
中的计算是否会被线程交错 ?如果我们更进一步,对每个CPU有更多的
A
函数调用,例如1个线程对应1个CPU,每个线程对A
函数调用4次来进行计算,那么A
的变量状态和计算将会有什么行为?
-
基于代码:
for(number_of_cpu) { create_thread(inner_struct(this));
相同的
this
指针值将传递给所有线程,因此线程将共享相同的n
,p
,x
和y
数据变量。A
的计算在任何情况下都会交错(除了临界区),但现在由于计算共享相同的数据变量,因此很有可能一次计算将使用用于另一次计算的中间值,从而导致数据损坏。我建议在这里使用某种形式的线程本地存储,通过定义
A
对象数组和/或使用正式机制,如boost::thread_specific_ptr。 -
如果不使用线程本地存储(即维持上面的代码),增加
A
函数的调用将增加数据损坏的机会。如果使用线程本地存储,由于指令仍然在线程内顺序执行,在每个线程中增加4个
A
函数调用将意味着计算时间大约是原来的5倍。这假定在每个线程中没有创建子线程来处理额外的调用。
相关文章:
- 将对象传递给多线程对象 Qt
- 在 While 循环中重用对象的多线程
- 修改多线程应用程序中的对象
- 在多线程环境中正确销毁对象
- 多线程可以访问同一weak_ptr对象C++吗?
- 对象析构函数在多线程处理时不断被调用,但该对象并未超出范围
- 关于多线程程序中的临时对象
- 在多线程环境中交换C 地图对象
- 在多线程中是否可能发生读取对象的一半大小?
- 通过引用和多线程传递对象
- 使用多线程处理对象数组 - 无效使用 void 表达式错误
- 如何为多线程应用程序创建全局对象
- C++11 使用共享对象的多线程处理
- 从多线程程序中安全地删除对象
- 我不明白多线程游戏中的对象不匹配
- 关闭MFC对话框时多线程对象被破坏
- 用于虚拟对象的Linux线程.有人能解释linux中多线程库之间的区别吗
- 控制对多线程程序中字符串对象的访问的最佳方法
- 多线程客户端中 COM 对象的初始化和实例化
- 多线程对象中的堆损坏