私はC++ 11でマルチスレッドについて学んでいますが、この単純なテストを試みましたが、出力は私が期待したものではありません。std :: mutexがstd :: coutのために正しくロックされていない
私は出力があることが予想#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;
}
:
Hello1
Hello2
Hello3
Hello4
(そうでないかもしれないという順ではなく、別の行の各ハローと数)
代わりに、私はこのようなものだ:
をHelloHello21
Hello3
Hello4
または
HelloHello2
1
Hello3
Hello4
正しくロックされていないミューテックス以外にどんなパズルがあるのかは、常にハロー1になってしまうということです。
EDIT:それは何の違いを行う場合VS2015で行われ(それはすべての標準だからいけない?)
関数に呼び出されるたびにローカル変数のコピーが取得されることを知っていますよね?したがって、この場合、すべてのスレッドは独自の別個のミューテックスを持っています。当然のことながら、1つのミューテックスをロックしても他のものはロックされません。 – immibis
は、この種のエラーを避けるために、ロックしているものと同じスコープにミューテックスを置くことをお勧めします。 –