Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;线程退出循环条件_C++_Linux_Multithreading_Loops_Condition Variable - Fatal编程技术网

C++ C++;线程退出循环条件

C++ C++;线程退出循环条件,c++,linux,multithreading,loops,condition-variable,C++,Linux,Multithreading,Loops,Condition Variable,我想在线程内创建一个计数器,并通过更改布尔值来停止它 这是我的密码: #include <unistd.h> #include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <chrono> using namespace std; bool _terminateT; mutex mtx; cond

我想在线程内创建一个计数器,并通过更改布尔值来停止它

这是我的密码:

#include <unistd.h>
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>

using namespace std;

bool _terminateT;
mutex mtx;
condition_variable cv;

void counter()
{
    unique_lock<mutex> lock(mtx);
    int i(0);

    while(!_terminateT)
    {
        cout<<i<<endl;
        i++;
        cv.wait(lock);
    }
}

int main()
{
    _terminateT = false;
    thread t(counter);

    sleep(4);
    {
        lock_guard<mutex> lckg(mtx);
        _terminateT = true;
    }

    cv.notify_one();

    cout<<"main"<<endl;
    t.join();

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
终结者;
互斥mtx;
条件变量cv;
无效计数器()
{
唯一锁(mtx);
int i(0);
while(!\u终结者)
{

cout对于该代码,您不需要条件变量。一个保护布尔变量的互斥锁就足够了。它应该在循环检查中被锁定和解锁


事实上,在没有数据竞争风险的特定示例中(您只需将变量从0设置为其他值一次),您甚至可以跳过互斥锁并以不受保护的方式设置变量-循环将始终终止,因为即使线程在主函数以外的其他核心上运行,其缓存最终也将获得正确的更改值。如果在线程之间共享其他数据,情况将有所不同。

对于该代码,您不需要条件变量。A保护布尔变量的互斥锁就足够了。它应该在循环检查中被锁定和解锁


事实上,在没有数据竞争风险的特定示例中(您只需将变量从0设置为其他值一次),您甚至可以跳过互斥锁并以不受保护的方式设置变量-循环将始终终止,因为即使线程在主函数以外的其他核心上运行,其缓存最终也将获得正确的更改值。如果您在线程之间共享其他数据,情况将有所不同。

非常感谢您的快速回复!!但是,您需要什么呢如果我在循环检查变量的值时更改了变量的值,就会发生uld?变量不会同时被读取和设置吗?这是不可能的。从这个角度来看,处理器以原子的方式工作,并且(大大简化了!)他们当时只做一件事。如果情况不同,并且您的变量不是将0更改为非0,例如将000000000000更改为123456789ABCDF01,则当一个CPU内核正在写入而另一个正在读取时,可能会发生数据争用。这可能会导致读卡器看到值为1234567800000-因此更新了一半。您可以阅读“缓存一致性”和MESI,但它相当复杂:)但处理器不会“中断”",just reader thread读取虚假数据。非常感谢您的澄清!非常感谢您的快速回复!!但是如果我在循环检查变量值时更改了变量的值,会发生什么情况?变量不会同时被读取和设置吗?这是不可能的。从这个角度来看,处理器以原子方式工作,并且(过于简单化了!)他们当时只做一件事。如果情况不同,并且您的变量不是将0更改为非0,例如将000000000000更改为123456789ABCDF01,则当一个CPU内核正在写入而另一个正在读取时,可能会发生数据争用。这可能会导致读卡器看到值为1234567800000-因此更新了一半。您可以阅读“缓存一致性”和MESI,但它相当复杂:)但处理器不会“中断”,只是读线程读取虚假数据。非常感谢您的澄清!