一个类的XYZ有3个成员变量x,y,z。有[N]个XYZ对象的向量。多线程,线程间通信,同步
有3个线程A,B,C,它们可以访问vector中的任何对象和该对象的任何成员变量。
class XYZ
{
public:
double x;
double y;
double z;
};
std ::具有N个元素的向量,其中N在整个程序中是固定的。
如何设计线程间通信以实现线程安全和最高效率,即最小的阻塞。
这里是我的一些思考过程,如果我错了,请纠正我。
- 将向量除以更小的向量并封装到每个线程中 类,然后使用消息队列传递数据。问题 都是3个线程都可以访问矢量和对象 成员的任何地方,因此很难细分和封装。 消息队列本身需要阻塞,即当发件人添加到队列时,读取器需要被阻塞 。
- 使用原子库使访问原子,因此避免 阻塞。问题原子依赖于操作系统,即某些操作被认为是原子操作,在Linux下可能不是原子操作,在Windows下可能不是原子操作。
- 互斥,为每个成员变量添加3个互斥对象,例如mutex_x, mutex_y,mutex_z。然而,问题是互斥的不可复制,
也就是说,如果我们有一个类一样,
class XYZ_mutex
{
public:
double x;
double y;
double z;
boost::mutex mutex_x;
boost::mutex mutex_y;
boost::mutex mutex_z;
};
我们不能有XYZ_mutex的载体,因为.push_back()是一个拷贝构造函数。
谢谢。
为什么要使用三个互斥量而不是一个互斥量?而你关于没有矢量的逻辑是错误的 - 你可以为你的类创建一个拷贝构造函数(当然,它不会复制互斥量,但你为什么要这样做?) – 2012-02-15 15:45:50
虽然“我们不能一个XYZ_mutex矢量,因为.push_back()是一个拷贝构造函数。“是真的,你可以拥有'ZYX_mutex *'的矢量。 – Griwes 2012-02-15 15:50:29
线程A,B,C对向量做了什么? – 2012-02-15 15:55:12