一個類的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