Linux に 2 つのスレッドを持つ C++ プログラムがあります。スレッド A は std::map にデータを書き込みます。他のデータはこのマップに書き込まれません。スレッド A はスレッド B を作成します。スレッド B はマップからデータを読み取ります。
この状況では、 Mutex を使用する必要がありますか?
そうでない場合、この保証はどこに指定されていますか。
Linux に 2 つのスレッドを持つ C++ プログラムがあります。スレッド A は std::map にデータを書き込みます。他のデータはこのマップに書き込まれません。スレッド A はスレッド B を作成します。スレッド B はマップからデータを読み取ります。
この状況では、 Mutex を使用する必要がありますか?
そうでない場合、この保証はどこに指定されていますか。
実際、支配的なパターンは、可能な限り次のようにする必要があります。
(変更可能な)データはタスクとともに移動します
したがって、データはそれを使用するスレッドによって所有されます。現在、「物理的に」移行する必要はありませんが、移動セマンティクスを使用すると、全体像がより明確になります。
#include <map>
#include <string>
using namespace std;
using Map = map<string, int>;
Map worker(Map&& data)
{
for (auto& el : data)
el.second *= -1;
return std::move(data);
}
#include <cassert>
#include <iostream>
#include <future>
int main()
{
Map global
{ { "one", 1 },
{ "two", 2 },
{ "three", 3 } };
auto background = async(worker, std::move(global));
assert(global.empty()); // data now owned by the worker thread!
global = background.get(); // await the result from the worker
for (auto const& el: global) // now the data is owned by the main thread
std::cout << el.first << ": " << el.second << "\n";
}
assert
の真ん中に注意してくださいmain
: 同時アクセスは不可能です。
Coliruでライブをご覧ください。