3

Linux に 2 つのスレッドを持つ C++ プログラムがあります。スレッド A は std::map にデータを書き込みます。他のデータはこのマップに書き込まれません。スレッド A はスレッド B を作成します。スレッド B はマップからデータを読み取ります。

この状況では、 Mutex を使用する必要がありますか?

そうでない場合、この保証はどこに指定されていますか。

4

3 に答える 3

1

実際、支配的なパターンは、可能な限り次のようにする必要があります。

(変更可能な)データはタスクとともに移動します

したがって、データはそれを使用するスレッドによって所有されます。現在、「物理的に」移行する必要はありませんが、移動セマンティクスを使用すると、全体像がより明確になります。

#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でライブをご覧ください。

于 2013-10-16T08:50:33.653 に答える