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小时内删除。