C 11中多執行緒

2021-09-22 21:21:11 字數 2283 閱讀 8708

std::lock_guard是raii模板類的簡單實現,功能簡單。

std::lock_guard 在建構函式中進行加鎖,析構函式中進行解鎖。

鎖在多執行緒程式設計中,使用較多,因此c++11提供了lock_guard模板類;在實際程式設計中,我們也可以根據自己的場景編寫resource_guardraii類,避免忘掉釋放資源。

類 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 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...