如下代码的实现功能为:
一个主线程不断的接收到来自服务器的数据,然后不同子程序分别根据接收到的数据来决定是否运行,第一个和代码块的内容是执行每个函数内部的一个循环后立马停止 ,第二个代码块表示一直运行某一个函数,等待主线程接收数据变换后停止。
#include <iostream>
#include <mutex>
#include <queue>
#include <condition_variable>
#include <thread>
std::mutex mut;
std::queue<int> data_queue;//-------------------①
std::condition_variable data_cond;
int a=4;
using namespace std;
// 定义一个发送数据的函数来模拟不停的从服务器接收数据
void recievedata() {
for (int i = 0; i < 100000; i++) {
a = i % 3;
data_cond.notify_all();
cout << "接收到数据!!!!";
cout << a << '\n';
this_thread::sleep_for(chrono::seconds(1));
}
}
void funct1() {
while (true) {
std::unique_lock<std::mutex> lk(mut);//-------------------④
data_cond.wait(lk, [] {return a == 0; });//-------------------⑤
cout << a;
std::cout << "after wait1" << std::endl;
a = 4;
//lk.unlock();//-------------------⑥
//假设处理数据data的函数process要花费大量时间,所以提前解锁
//process(data);
}
}
void funct2() {
while (true) {
std::unique_lock<std::mutex> lk(mut);//-------------------④
data_cond.wait(lk, [] {return a == 1; });//-------------------⑤
std::cout << "after wait2" << std::endl;
a = 4;
lk.unlock();//-------------------⑥
//假设处理数据data的函数process要花费大量时间,所以提前解锁
//process(data);
}
}
void funct3() {
while (true) {
std::unique_lock<std::mutex> lk(mut);//-------------------④
data_cond.wait(lk, [] {return a == 2; });//-------------------⑤
std::cout << "after wait3" << std::endl;
a = 4;
lk.unlock();//-------------------⑥
//假设处理数据data的函数process要花费大量时间,所以提前解锁
//process(data);
}
}
int main() {
std::thread t1(recievedata);
std::thread t2(funct1);
std::thread t3(funct2);
std::thread t4(funct3);
t1.join();
t2.join();
t3.join();
t4.join();
}
#include <iostream>
#include <mutex>
#include <queue>
#include <condition_variable>
#include <thread>
#include "mythread.h"
std::mutex mut;
std::queue<int> data_queue;//-------------------①
std::condition_variable data_cond;
int a=4;
using namespace std;
void mySleep(int s)
{
std::this_thread::sleep_for(std::chrono::duration<double>(s));
}
class MyThread : public Thread
{
protected:
virtual void process() override
{
cout << "do my something" << endl;
mySleep(1);
}
};
// 定义一个发送数据的函数来模拟不停的从服务器接收数据
void recievedata() {
for (int i = 0; i < 100000; i++) {
a = i % 3;
data_cond.notify_all();
cout << "接收到数据!!!!";
cout << a << '\n';
this_thread::sleep_for(chrono::seconds(1));
}
}
void funct1() {
while (true) {
std::unique_lock<std::mutex> lk(mut);//-------------------④
data_cond.wait(lk, [] {return a == 0; });//-------------------⑤
cout << a;
std::cout << "after wait1" << std::endl;
//lk.unlock();//-------------------⑥
//假设处理数据data的函数process要花费大量时间,所以提前解锁
//process(data);
}
}
void funct2() {
while (true) {
std::unique_lock<std::mutex> lk(mut);//-------------------④
data_cond.wait(lk, [] {return a == 1; });//-------------------⑤
std::cout << "after wait2" << std::endl;
lk.unlock();//-------------------⑥
//假设处理数据data的函数process要花费大量时间,所以提前解锁
//process(data);
}
}
void funct3() {
while (true) {
std::unique_lock<std::mutex> lk(mut);//-------------------④
data_cond.wait(lk, [] {return a == 2; });//-------------------⑤
std::cout << "after wait3" << std::endl;
lk.unlock();//-------------------⑥
//假设处理数据data的函数process要花费大量时间,所以提前解锁
//process(data);
}
}
int main() {
std::thread t1(recievedata);
std::thread t2(funct1);
std::thread t3(funct2);
std::thread t4(funct3);
t1.join();
t2.join();
t3.join();
t4.join();
}