C++11多线程编程使⽤lambda创建std::thread(⽣产消费者
模式)
要写个tcp server / client的博客,想着先写个c++11多线程程序。⽅便后⾯写博客使⽤。
⽬前c++11中写多线程已经很⽅便了,不⽤再像之前的pthread_create,c++11中已经有了std::thread库可以⽅便使⽤。
直接看代码(100个任务, 多个线程处理):
1 #include <iostream>
2 #include <thread>
3 #include <chrono>
4 #include <vector>
5 #include <mutex>
6
lambda编程7class Task{
8public:
9 Task(int x, std::shared_ptr<std::mutex> mutex)
10 :_x(x), _mutex(mutex){ }
11
12void handle(){
13int task_id = 0;
14while(true){
15//获取任务, 尽早释放锁
16if (_x > 0){
17 std::lock_guard<std::mutex> lock(*_mutex);
18if (_x > 0){ task_id = _x; --_x; }
19else { _x = 0; }
20 }
21else { return ; }
22
23//do task
24 std::cout << "do task id: " << task_id << std::endl;
25 std::this_thread::sleep_for(std::chrono::seconds(1));
26 }
27 }
28private:
29int _x;
30 std::shared_ptr<std::mutex> _mutex;
31 };
32
33int main()
34 {
35int x = 0;
36const int THREAD_NUM = 7;
37const int TASK_NUM = 100;
38 std::vector<std::thread> threads;
39
40//shared_ptr 主线程与⼦线程可以共⽤⼀把锁.
41//⽅便后⾯扩展程序(⽣产/消费者)
42 std::shared_ptr<std::mutex> mutex = std::make_shared<std::mutex>();
43 Task t(TASK_NUM, mutex);
44
45//新建线程, std::thread⽀持使⽤lambda
46for (int i = 0; i < THREAD_NUM; ++i){
47 place_back(std::thread(
48 [&t] { t.handle(); })
49 );
50 }
51
52//等待线程结束
53for(auto &thread : threads){ thread.join(); }
54return0;
55 }
编译、执⾏:
g++ --std=c++11 -pthread thread.cpp
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论