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;
}