volatile
ürününü m_flag
tanımından kaldırmak güvenli midir? m_flag
geçici değilse, derleyicilerin bu döngünün durumunu en iyi duruma getirmesini engeller: while (!m_flag) m_cv.wait(lock);
? Standart (post-C++ 11) bu tür optimizasyonların bu gibi durumlarda yasak olduğunu açıkça belirtiyor mu?Burada C++ uçucusunu kaldırmak güvenli midir?
#include <mutex>
#include <condition_variable>
#include <future>
#include <iostream>
using namespace std;
class foofoo
{
volatile bool m_flag;
mutex m_mutex;
condition_variable m_cv;
public:
void DoWork()
{
m_flag = false;
unique_lock<mutex> lock(m_mutex);
auto junk = async(std::launch::async, [this]()
{
{
unique_lock<mutex> lock(m_mutex);
m_flag = true;
}
m_cv.notify_one();
});
while (!m_flag) m_cv.wait(lock);
cout << "ququ" << endl;
}
};
int main()
{
foofoo f;
f.DoWork();
}
Teşekkürler! Yani, başka bir deyişle, döngü gövdesi döngü koşulunu değiştirmez, ancak bir eşitleme "nokta" içeriyorsa, bir derleyicinin, döngü koşulunun "görünür bir taraftan etkilenip etkilenmeyeceğini" analiz etmesi gerekir. "aynı" nokta ile senkronize edilebilen başka bir iş parçasından "etki"? Pratikte, derleyiciler muhtemelen pes edecek ve asla bu tür döngüleri optimize etmeye çalışacaklardır? .. –
"Döngünün durumunu en iyi duruma getirme" yi kastediyorum. Sadece her yerde "döngü" dediğimi fark ettim, açıkçası döngü hala kalacaktı, sadece sonsuz bir döngüye dönüştü ... –
@MaxGalkin Bir veri yarışması yazmadığınız sürece derleyici değişikliklerin yapılmasını sağlamalı Daha önce bir muteks salgılayan bir iş parçacığı tarafından yapılan, daha sonra aynı muteks elde eden bir iş parçacığına görünür. "Hiç teşebbüs etme" dersem de emin değilim, ama kod veri yarışlarından arınmış olduğu sürece, uygun bir derleyici ile sürprizler olmamalı. –