std::lock_guard是raii模板類
的簡單實現,功能簡單。
std::lock_guard 在建構函式中進行加鎖,析構函式中進行解鎖。
鎖在多執行緒程式設計中,使用較多,因此c++11提供了lock_guard模板類;在實際程式設計中,我們也可以根據自己的場景編寫resource_guard
raii類,避免忘掉釋放資源。
類 unique_lock 是通用互斥包裝器,允許延遲鎖定、鎖定的有時限嘗試、遞迴鎖定、所有權轉移和與條件變數一同使用
。
unique_lock比lock_guard使用更加靈活,功能更加強大。
使用unique_lock需要付出更多的時間、效能成本。
條件變數std::condition_variable用於多執行緒之間的通訊,它可以阻塞乙個或同時阻塞多個執行緒。std::condition_variable需要與std::unique_lock配合使用。
當std::condition_variable物件的某個wait函式被呼叫的時候,它使用std::unique_lock(通過std::mutex)來鎖住當前執行緒。當前執行緒會一直被阻塞,直到另外乙個執行緒在相同的std::condition_variable物件上呼叫了notification函式來喚醒當前執行緒。
std::condition_variable物件通常使用std::unique_lock來等待,如果需要使用另外的lockable型別,可以使用std::condition_variable_any類。
需要維護兩個計數器,分別是生產者已生產產品的數目和消費者已取走產品的數目。另外也需要保護產品庫在多個生產者和多個消費者互斥地訪問。
#include #include #include #include #include static const int kitemrepositorysize = 4; // item buffer size.
static const int kitemstoproduce = 10; // how many items we plan to produce.
struct itemrepository gitemrepository;
typedef struct itemrepository itemrepository;
void produceitem(itemrepository *ir, int item)
(ir->item_buffer)[ir->write_position] = item;
(ir->write_position)++;
if (ir->write_position == kitemrepositorysize)
ir->write_position = 0;
(ir->repo_not_empty).notify_all();
lock.unlock();
}int consumeitem(itemrepository *ir)
data = (ir->item_buffer)[ir->read_position];
(ir->read_position)++;
if (ir->read_position >= kitemrepositorysize)
ir->read_position = 0;
(ir->repo_not_full).notify_all();
lock.unlock();
return data;
}void producertask()
else ready_to_exit = true;
lock.unlock();
if (ready_to_exit == true) break;
}std::cout << "producer thread " << std::this_thread::get_id()
<< " is exiting..." << std::endl;
}void consumertask()
else ready_to_exit = true;
lock.unlock();
if (ready_to_exit == true) break;
}std::cout << "consumer thread " << std::this_thread::get_id()
<< " is exiting..." << std::endl;
}void inititemrepository(itemrepository *ir)
int main()
C 11 多執行緒
新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...
c 11 多執行緒
1.多執行緒的原理 同一時間內,cpu只能處理1條執行緒,只有1條執行緒在工作 執行 多執行緒併發 同時 執行,其實是cpu快速地在多條執行緒之間排程 切換 如果cpu排程執行緒的時間足夠快,就造成了多執行緒併發執行的假象。思考 如果執行緒非常非常多,會發生什麼情況?cpu會在n多執行緒之間排程,c...
C 11 多執行緒
2011 年 c 迎來重大的改革 語言層面上承認了 多執行緒 程式的存在 加入了 thread 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...