C 併發程式設計(五) 生產者 消費者

2021-09-18 03:26:38 字數 2476 閱讀 9841

生產者 - 消費者(producer-consumer),也叫有限緩衝(bounded-buffer),是多執行緒同步的經典問題之一。詳見 wikipedia。

**改寫自 boost.thread 自帶的示例(libs/thread/example/condition.cpp),以「條件變數」實現同步。

#include #include #include #include #include
class boundedbuffer 

void produce(int n) );

// 插入新的元素,更新下標。

circular_buffer_[end_] = n;

end_ = (end_ + 1) % circular_buffer_.size();

++buffered_;

} // 通知前,自動解鎖。

// 通知消費者。

not_empty_cv_.notify_one();

} int consume() );

// 移除乙個元素。

int n = circular_buffer_[begin_];

begin_ = (begin_ + 1) % circular_buffer_.size();

--buffered_;

// 通知前,手動解鎖。

lock.unlock();

// 通知生產者。

not_full_cv_.notify_one();

return n;

}private:

std::size_t begin_;

std::size_t end_;

std::size_t buffered_;

std::vectorcircular_buffer_;

std::condition_variable not_full_cv_;

std::condition_variable not_empty_cv_;

std::mutex mutex_;

};

生產者與消費者執行緒共享的緩衝。g_io_mutex是用來同步輸出的。

boundedbuffer g_buffer(2);

boost::mutex g_io_mutex;

生產 100000 個元素,每 10000 個列印一次。

void producer() 

++n;

} g_buffer.produce(-1);

}

每消費到 10000 的倍數,列印一次。

void consumer() 

} while (n != -1); // -1 表示緩衝已達末尾。

// 往緩衝裡再放乙個 -1,這樣其他消費者才能結束。

g_buffer.produce(-1);

}

乙個生產者執行緒,三個消費者執行緒。

int main() 

return 0;

}

輸出(括號中為執行緒 id):

produce: 0

consume: 0 (13c0)

produce: 10000

consume: 10000 (15fc)

produce: 20000

consume: 20000 (2558)

produce: 30000

consume: 30000 (13c0)

produce: 40000

consume: 40000 (15fc)

produce: 50000

consume: 50000 (13c0)

produce: 60000

consume: 60000 (15fc)

produce: 70000

consume: 70000 (13c0)

produce: 80000

consume: 80000 (15fc)

produce: 90000

consume: 90000 (15fc)

考慮乙個生產者和乙個消費者的情形,假定緩衝的大小為 2,來看看三個成員變數如何變化。

buffered_    begin_      end_

初始 0 0 0

生產 1 0 1

消費 0 1 1

消費 等待 buffered_ > 0 ...

生產 1 1 0

...

參考:

c 11生產者消費者

綜合運用 c 11 中的新的基礎設施 主要是多執行緒 鎖 條件變數 來闡述乙個經典問題 生產者消費者模型,並給出完整的解決方案。include include include include include include static const int kitemrepositorysize 1...

5 12 生產者和消費者

一 生產者和消費者之間的關係 1 生產者將生產出來的資訊不斷存入乙個區域內,消費者將資訊從該區域內不斷讀取出來 生產者錄入資訊 消費者讀取資訊 例 電影票 public class movie public void setname string name public string getinfo...

6 1 生產者 消費者問題

在多執行緒程式中,執行緒之間通常存在分工。在一種常見模式中,一些執行緒是生產者,一些是消費者。需要強制執行幾個同步約束才能使此系統正常工作 在緩衝區中新增或刪除專案時,緩衝區處於不一致狀態。因此,執行緒必須具有對緩衝區的獨佔訪問許可權。如果消費者執行緒在緩衝區為空時到達,則會阻塞,直到生產者新增新專...