【发布时间】:2012-03-06 23:21:49
【问题描述】:
一个类 XYZ 有 3 个成员变量 x、y、z。有 [N] 个 XYZ 对象的向量。
有 3 个线程 A、B、C,它们可以访问向量中的任何对象以及该对象的任何成员变量。
class XYZ
{
public:
double x;
double y;
double z;
};
std::vector 有 N 个元素,其中 N 在整个程序中是固定的。
如何设计线程间通信以实现线程安全和最大效率,即最小阻塞。
这是我的一些思考过程,如果我错了,请纠正我。
- 将向量分成更小的向量并封装到每个线程中 类,然后使用消息队列来传递数据。问题 所有 3 个线程都可以访问向量和对象的任何位置 成员,因此难以细分和封装。 消息队列本身需要阻塞,即需要读取器 发件人添加到队列时被阻止。
- 使用原子库使访问原子化,因此避免 阻塞。问题是原子性的,依赖于操作系统,即一些 操作在Linux下被认为是原子的,在Linux下可能不是原子的 窗户。
- 互斥体,为每个成员变量添加3个互斥体对象,例如,mutex_x, 互斥量_y,互斥量_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() 是一个复制构造函数。
谢谢。
【问题讨论】:
-
为什么要使用三个互斥锁而不是一个?而且你关于没有向量的逻辑是错误的——你可以为你的类创建一个复制构造函数(它当然不会复制互斥体,但你为什么要这样做呢?)
-
虽然“我们不能拥有 XYZ_mutex 的向量,因为 .push_back() 是一个复制构造函数。”是的,你可以只拥有
ZYX_mutex *的向量。 -
线程 A、B、C 对向量做了什么?
-
您还没有定义“访问”。是读访问、写访问还是两者兼而有之?
-
效率问题可能无法在此级别解决。您的 XYZ 将进行什么样的操作?该问题的答案应该决定您的共享/分发设计。
标签: c++ multithreading