2016-11-08 130 views
1

我有一個包含boost :: mutex作爲私有成員的類。當你調用其中的一個公共函數時它就會被鎖定,當函數退出時它會被解鎖。這是爲了提供對對象內部的同步訪問。使用boost :: mutex作爲類的私有成員

class StringDeque 
{ 
    boost::mutex mtx; 
    std::deque<string> string_deque; 
public: 
    StringDeque() { } 

    void addToDeque(const string& str_to_add) 
    { 
    boost::lock_guard<boost::mutex> guard(mtx); 
    string_deque.push(str_to_add); 
    } 

    string popFromDeque() 
    { 
    boost::lock_guard<boost::mutex> guard(mtx); 
    string popped_string = string_deque.front(); 
    string_deque.pop(); 
    return popped_string; 
    } 
}; 

這個類並不意味着特別有用,但我只是玩弄互斥和線程。

我有一個main(),也有另一個函數定義,從類中彈出字符串並將它們打印到一個線程中。它會重複這10次,然後從函數中返回。再一次,這純粹是爲了測試目的。它看起來像這樣:

void printTheStrings(StringDeque& str_deque) 
{ 
    int i = 0; 
    while(i < 10) 
    { 
     string popped_string = str_deque.popFromDeque(); 
     if(popped_string.empty()) 
     { 
     sleep(1); 
     continue; 
     } 
     cout << popped_string << endl; 
     ++i; 
    } 
} 

int main() 
{ 
    StringDeque str_deque; 
    boost::thread the_thread(printTheStrings, str_deque); 
    str_deque.addToDeque("Say your prayers"); 
    str_deque.addToDeque("Little One"); 
    str_deque.addToDeque("And Don't forget My Son"); 
    str_deque.addToDeque("To include everyone"); 
    str_deque.addToDeque("I tuck you in"); 
    str_deque.addToDeque("Warm within"); 
    str_deque.addToDeque("Keep you free from sin"); 
    str_deque.addToDeque("Until the sandman he comes"); 
    str_deque.addToDeque("Sleep with one eye open"); 
    str_deque.addToDeque("Gripping your pillow tight"); 
    the_thread.join(); 
} 

我一直得到的錯誤是boost :: mutex是不可複製的。 printTheStrings()函數需要一個引用,所以我有點困惑,爲什麼這是試圖複製對象。

我已經閱讀了一下,我一直在閱讀的一個解決方案是使boost :: mutex成爲對象的靜態私有成員。然而,這會破壞我的互斥鎖的目的,因爲我希望它是逐個對象而不是類變量。

這只是不好的互斥體使用?我應該重新考慮這整個應用程序嗎?

編輯:

我剛剛發現condition_variable這應該成爲我的目的好了很多有線程等待,直到有東西居然在雙端隊列醒來從雙端隊列彈出,並在打印之前。我看到的所有示例都將這些互斥體和condition_variable對象定義在全局範圍內。在我看來,這看起來非常...不是面向對象的。即使直接來自Boost的例子也表明它是以這種方式完成的。這真的是其他人如何使用這些對象嗎?

+1

然後讓您的課程不可複製。 '刪除'複製構造函數和指派操作符。 –

+1

不要複製編譯器消息,複製並粘貼未編輯的消息,包括他們的行號。指出來源中的違規行。 –

+0

定義您自己的複製構造函數,您不復制該互斥量。 http://www.boost.org/doc/libs/1_61_0/doc/html/thread/thread_management.html#thread.thread_management.thread.callable_constructor –

回答

2

你是對的,printToStringStringQueue作爲參考。你的問題在於boost::thread按價值論據。迫使它參照接受的參數,您將需要修改的東西:

boost::thread the_thread(printTheStrings, boost::ref(str_deque)); 

順便說一句,從C++ 11日起,線程是標準庫的一部分。您應該使用std::thread instead

+0

我使用的古代編譯器只支持C++ 11的實驗形式。 –

+0

作爲任何使用boost的好理由 – doron