c+中的锁和条件变量出现问题+;多线程 我试图在C++中实现一个简单的多线程示例(Windows 10,VisualStudio Express)。
我有计算z=x*x的threadT1,其中x和z是全局变量。 线程T2显示z 我想使用锁和条件变量 由于某种原因,在T1解除阻塞时执行会被卡住(在cv.wait之后,可能在while循环中——CPU使用率高)。但是当我添加一些代码时,不会发生这种情况(我尝试了c+中的锁和条件变量出现问题+;多线程 我试图在C++中实现一个简单的多线程示例(Windows 10,VisualStudio Express)。,c++,multithreading,locking,mutex,condition-variable,C++,Multithreading,Locking,Mutex,Condition Variable,我有计算z=x*x的threadT1,其中x和z是全局变量。 线程T2显示z 我想使用锁和条件变量 由于某种原因,在T1解除阻塞时执行会被卡住(在cv.wait之后,可能在while循环中——CPU使用率高)。但是当我添加一些代码时,不会发生这种情况(我尝试了cout问题在于: lk.unlock(); while (datax) { cv.notify_one(); } cv.wait(lk, [] {return zPrinted; }); // <-- waiting on un
cout问题在于:
lk.unlock();
while (datax) {
cv.notify_one();
}
cv.wait(lk, [] {return zPrinted; }); // <-- waiting on unlocked mutex
zPrinted = 0;
lk.unlock();
while(datax){
cv.通知_one();
}
cv.wait(lk,[]{return zPrinted;});//除了上面提到的等待解锁互斥锁的问题之外:
cv.wait(lk, [] {return zPrinted; });
您的线程没有重新连接,并且正在运行无限循环。下面是一个使用mods的工作版本,用于解决这些问题:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
mutex m;
condition_variable cv;
bool datax = 0, dataz = 0, zPrinted = 0;
bool kill = 0;
void T1(const int& x, int& z)
{
do {
unique_lock<mutex> lk(m);
cv.wait(lk, [] {return (datax+kill); });
if (kill) return;
if (datax) {
z = x * x;
datax = 0;
dataz = 1;
lk.unlock();
while (dataz)
cv.notify_one();
}
} while (1);
}
void T2(const int& z)
{
do {
unique_lock<mutex> lk(m);
cv.wait(lk, [] {return (dataz+kill); });
if (kill) return;
if (dataz) {
cout << "z = " << z << endl;
dataz = 0;
zPrinted = 1;
lk.unlock();
while (zPrinted)
cv.notify_one();
}
} while (1);
}
int main()
{
int x, z;
char c;
thread threadT1(T1, cref(x), ref(z));
thread threadT2(T2, cref(z));
do {
{
unique_lock<mutex> lk(m);
cout << "Enter x: ";
cin >> x;
datax = 1;
lk.unlock();
while (datax)
cv.notify_one();
}
{
unique_lock<mutex> lk(m);
cv.wait(lk, [] {return zPrinted; });
lk.unlock();
}
zPrinted = 0;
cout << "Continue? (y/n): ";
cin >> c;
} while (c == 'y');
kill = 1;
cv.notify_all();
threadT1.join();
threadT2.join();
return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
互斥m;
条件变量cv;
bool datax=0,dataz=0,zPrinted=0;
bool-kill=0;
无效T1(常数int&x,int&z)
{
做{
唯一锁lk(m);
cv.wait(lk,[{return(datax+kill);});
如果(杀死)返回;
if(datax){
z=x*x;
datax=0;
dataz=1;
lk.unlock();
while(dataz)
cv.通知_one();
}
}而(1),;
}
无效T2(常数内和z)
{
做{
唯一锁lk(m);
cv.wait(lk,[{return(dataz+kill);});
如果(杀死)返回;
if(dataz){
你为什么要重复通知两个线程中的条件变量?或者甚至所有3个线程都不是原子的-并且你在锁之外读/写它。这不是一个好的计划。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
mutex m;
condition_variable cv;
bool datax = 0, dataz = 0, zPrinted = 0;
bool kill = 0;
void T1(const int& x, int& z)
{
do {
unique_lock<mutex> lk(m);
cv.wait(lk, [] {return (datax+kill); });
if (kill) return;
if (datax) {
z = x * x;
datax = 0;
dataz = 1;
lk.unlock();
while (dataz)
cv.notify_one();
}
} while (1);
}
void T2(const int& z)
{
do {
unique_lock<mutex> lk(m);
cv.wait(lk, [] {return (dataz+kill); });
if (kill) return;
if (dataz) {
cout << "z = " << z << endl;
dataz = 0;
zPrinted = 1;
lk.unlock();
while (zPrinted)
cv.notify_one();
}
} while (1);
}
int main()
{
int x, z;
char c;
thread threadT1(T1, cref(x), ref(z));
thread threadT2(T2, cref(z));
do {
{
unique_lock<mutex> lk(m);
cout << "Enter x: ";
cin >> x;
datax = 1;
lk.unlock();
while (datax)
cv.notify_one();
}
{
unique_lock<mutex> lk(m);
cv.wait(lk, [] {return zPrinted; });
lk.unlock();
}
zPrinted = 0;
cout << "Continue? (y/n): ";
cin >> c;
} while (c == 'y');
kill = 1;
cv.notify_all();
threadT1.join();
threadT2.join();
return 0;
}