写了一个最简单的生产者消费者模式
以供初学者的学习使用
#include <iostream>
#include <deque>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
const int bufsize = 10;
const int total = 100;
mutex mtx;
condition_variable pro;
condition_variable con;
struct Buffer {
deque<int> que;
int mark = 0;
};
//Buffer buf;
int index = 0;
void func_producer(Buffer *buf)
{
for (index = 0; index < total; index++)
{
unique_lock<mutex> ulock(mtx);
/*while (buf->mark >= bufsize)
pro.wait(ulock);*/
pro.wait(ulock, [&] {
if (buf->mark < bufsize)
return true;
return false;
});
cout << "生产者生产第 " << index << " 个" << endl;
buf->que.push_back(index);
buf->mark++;
ulock.unlock();
con.notify_all();
}
cout << "生产者结束" << endl;
}
void func_consumer(Buffer *buf)
{
while (true)
{
unique_lock<mutex> ulock(mtx);
/*while (buf->mark <= 0)
con.wait(ulock);*/
con.wait(ulock, [&] {
if (buf->mark > 0)
return true;
return false;
});
cout << "消费者取出元素 " << buf->que.front() << endl;
buf->que.pop_front();
buf->mark--;
ulock.unlock();
pro.notify_all();
if (index == total && buf->mark == 0)
break;
}
cout << "消费者结束" << endl;
}
int main()
{
Buffer buf;
thread process(func_producer, &buf);
thread consume(func_consumer, &buf);
process.join();
consume.join();
return 0;
}
同时在 VS 和 GCC 上分别编译运行,结果如下
VS下运行线程之间比较“整齐”,表面上是执行完生产者再执行消费者,但是这只是表面
GCC 下,运行时线程之间的通讯较为明显
最后附上CMakeList.txt
cmake_minimum_required(VERSION 2.6)
project(self)
SET(CMAKE_C_COMPILER g++)
set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++11 -pthread”)
add_executable(xx xx.cpp)