C++ 11'de çoklu okuma hakkında bilgi edindim ve bu basit testi denedim ancak çıktı beklediğim gibi değil.std :: mutex std :: cout için düzgün şekilde kilitlenmiyor
#include <thread>
#include <iostream>
#include <mutex>
int main() {
auto function = [](int x) {
std::mutex m;
m.try_lock();
std::cout << "Hello" << x << std::endl;
m.unlock();
return;
};
std::thread t1(function , 1);
std::thread t2(function, 2);
std::thread t3(function, 3);
std::thread t4(function, 4);
t1.join();
t2.join();
t3.join();
t4.join();
std::cin.get();
return 0;
}
Ben çıkışı olması bekleniyor:
Hello1
Hello2
Hello3
Hello4
(belki bu sırayla ancak her Merhaba ve ayrı bir satırda numara)
yerine böyle bir şey var:
HelloHello21
Hello3
Hello4
Ya
HelloHello2
1
Hello3
Hello4
Muteks'in düzgünce kilitlenmemesi yanında ne yapması gerektiği de, bulmacaları yarıya indiren kişi olan Hello1'dir.
DÜZENLEME: VS2015 yapılan mutlaka muteksi kilitlemez herhangi bir fark (hepsi standarttır olmamalı çünkü?)
Bir fonksiyona yapılan her çağrının yerel değişkenlerin kendi kopyasını aldığını biliyorsunuz, değil mi? Yani bu durumda her iş parçacığının kendi ayrı muteksi vardır. Beklenmeyen bir şekilde, bir muteksin kilitlenmesi diğerlerinin hiçbirini kilitlemez. – immibis
, mutex'in kilitlediğiniz şeyle aynı kapsamda olmasını öneriyor, bu tür hataları önlemek için –