c+中的锁和条件变量出现问题+;多线程 我试图在C++中实现一个简单的多线程示例(Windows 10,VisualStudio Express)。

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

我有计算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 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;
}