1、创建多个线程
多线程的调度由操作系统负责,线程执行的先后没有严格的顺序完全看操作系统和CPU的心情。
#include <iostream>
#include <vector>
#include <thread>void thread_print(int num)
{std::cout << "线程编号 = " << num << ", 开始工作" << std::endl;std::cout << "-----线程编号 = " << num << ", 执行完毕-----" << std::endl;return ;
}int main() {std::cout << "Hello, World!" << std::endl;std::vector<std::thread> thread_vector;for(int i = 0;i < 10;i++){thread_vector.push_back(std::thread(thread_print, i));}for(auto it = thread_vector.begin();it != thread_vector.end();it++){it->join();}std::cout << "main thread executed finish!" << std::endl;return 0;
}
2、数据共享问题
- 只读的数据:是安全稳定的,不需要特别的处理手段,直接大家都读就行。
- 有读有写:2个线程写,8个线程读,由于任务切换可能会导致各种问题出现。此时就需要互斥,读的时候不能写,写的时候不能读。
- 例如对一个queue容器:一个线程放数据一个线程取数据,如果两个线程不互斥那么将会导致错误访问。
#include <iostream>
#include <vector>
#include <thread>
#include <queue>class MessageQueue{
public:void inMsgRecvQueue(){for(int i = 0;i < n;i++){std::cout << "inMsgRecvQueue()执行, 插入一个元素i = " << i << std::endl;q.push(i);}}void outMsgRecvQueue(){for(int i = 0;i < n;i++){if(q.size()){int msg = q.front();q.pop();}else{std::cout << "outMsgRecvQueue()执行, 但此时消息队列中为空" << std::endl;}}}
private:std::queue<int> q;static const int n = 100000;
};int main() {MessageQueue messageQueue;std::thread in_thread(&MessageQueue::inMsgRecvQueue, std::ref(messageQueue));std::thread out_thread(&MessageQueue::outMsgRecvQueue, std::ref(messageQueue));in_thread.join();out_thread.join();return 0;
}