C++ 线程退出循环条件
C++ thread exit loop condition
我想在线程内创建一个计数器,并通过更改布尔值来停止它。
这是我的代码:
#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;
}
问题是循环被wait
函数阻塞了。
有没有办法在不阻塞 while 循环的情况下保护 _terminateT
变量?
对于该代码,您不需要条件变量。保护布尔变量的互斥量就足够了。应该在循环检查中锁定和解锁。
事实上,在那个没有数据竞争风险的特定示例中(您只是将变量从 0 设置为其他值一次),您甚至可以跳过互斥锁并以不受保护的方式设置变量 - 循环将始终终止,因为即使线程在主函数以外的其他核心上运行,其缓存最终也会获得正确的更改值。如果您在线程之间共享其他数据,情况会有所不同。
我想在线程内创建一个计数器,并通过更改布尔值来停止它。
这是我的代码:
#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;
}
问题是循环被wait
函数阻塞了。
有没有办法在不阻塞 while 循环的情况下保护 _terminateT
变量?
对于该代码,您不需要条件变量。保护布尔变量的互斥量就足够了。应该在循环检查中锁定和解锁。
事实上,在那个没有数据竞争风险的特定示例中(您只是将变量从 0 设置为其他值一次),您甚至可以跳过互斥锁并以不受保护的方式设置变量 - 循环将始终终止,因为即使线程在主函数以外的其他核心上运行,其缓存最终也会获得正确的更改值。如果您在线程之间共享其他数据,情况会有所不同。