生产消费模型实例C++11
2016-04-07 20:46
393 查看
#include <iostream> // std::cout #include <thread> // std::thread #include <mutex> // std::mutex, std::unique_lock #include <condition_variable> // std::condition_variable #include <chrono> #include <unistd.h> std::mutex mtx; // 全局互斥锁. std::condition_variable cv; // 全局条件变量. using namespace std; void consumer(int id) { std::unique_lock <std::mutex> lck(mtx); while (true) { cout << "read " << id << endl; cv.wait(lck); } // 线程被唤醒, 继续往下执行打印线程编号id. std::cout << "thread " << id << '\n'; } void go() { cout << "tell consumer to process. " <<endl; cv.notify_all(); // 唤醒所有线程. } void producer(){ int ok; while(1) { cin >> ok; cout <<"ok is"<< ok ; if(ok){ std::cout << "10 threads ready to race...\n"; sleep(2); go(); // go! } ok = 0; } } int main() { std::thread threads[10]; // spawn 10 threads: for (int i = 0; i < 10; ++i) threads[i] = std::thread(consumer, i); producer(); for (auto & th:threads) th.join(); return 0; }
这里不做文字说明,此时的文字说明显得有些多余。GCC需要在4.8+,以便支持c++11。
需要注意的是,常见的代码实现的 生产消费者模型都是消费者线程轮询产品的方式。从系统性能和原理上面来看,都是不完美的。
cmake脚本如下
PROJECT(sample) set (CMAKE_CXX_STANDARD 11) include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread") elseif(COMPILER_SUPPORTS_CXX0X) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") else() message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") endif() CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #本地目录 INCLUDE_DIRECTORIES(".") FILE(GLOB root "./*.cpp") link_directories("/usr/lib/x86_64-linux-gnu/") AUX_SOURCE_DIRECTORY(. DIR_SRCS) ADD_EXECUTABLE(sample ${DIR_SRCS} ${root} ) TARGET_LINK_LIBRARIES(sample m -lpthread)
相关文章推荐
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 交换机升级排障实例
- sql2008启动代理未将对象应用到实例解决方案
- Ajax教程实例详解
- 初识JQuery 实例一(first)
- JQuery入门基础小实例(1)
- Jquery具体实例介绍AJAX何时用,AJAX应该在什么地方用
- 一个小助手批处理实例代码
- XStream使用方法总结附实例代码
- asp.net得到本机数据库实例的两种方法代码
- C++多继承同名隐藏实例详细介绍
- PHP入门学习的几个不错的实例代码
- JSP发送邮件实例
- C#中的IEnumerable简介及简单实现实例
- jQuery Ajax 实例详解 ($.ajax、$.post、$.get)
- PHP中的流(streams)浅析
- PHP curl使用实例
- 非常好用的JsonToString 方法 简单实例
- 举例说明JavaScript中的实例对象与原型对象
- C#确保只有一个实例在运行的方法