57

関数に静的な変数がありますが、スレッドごとに静的にしたいと考えています。

各スレッドが独自のクラス インスタンスのコピーを持つように、C++ クラスにメモリを割り当てるにはどうすればよいですか?

AnotherClass::threadSpecificAction()
{
  // How to allocate this with thread local storage?
  static MyClass *instance = new MyClass();

  instance->doSomething();
}

これはLinux上にあります。私は C++0x を使用していません。これは gcc v3.4.6 です。

4

9 に答える 9

66

thread_localC++11 でキーワードが導入されたことは注目に値します。

これはStorage duration specifiersの例です:

#include <iostream>
#include <string>
#include <thread>
#include <mutex>

thread_local unsigned int rage = 1; 
std::mutex cout_mutex;

void increase_rage(const std::string& thread_name)
{
    ++rage;
    std::lock_guard<std::mutex> lock(cout_mutex);
    std::cout << "Rage counter for " << thread_name << ": " << rage << '\n';
}

int main()
{
    std::thread a(increase_rage, "a"), b(increase_rage, "b");
    increase_rage("main");

    a.join();
    b.join();

    return 0;
}

可能な出力:

Rage counter for a: 2
Rage counter for main: 2
Rage counter for b: 2
于 2013-03-29T06:01:44.560 に答える
14

boost::thread_specific_ptrポータブル ソリューションとして最適な方法です。

Linux と GCC では、__thread修飾子を使用できます。

したがって、インスタンス変数は次のようになります。

static __thread MyClass *instance = new MyClass();
于 2011-05-18T07:55:40.947 に答える
4

MSVC++ を使用している場合は、Thread Local Storage (TLS)を読むことができます。

そして、この例を見ることができます。

また、 TLSのルールと制限事項にも注意してください。

于 2011-05-16T17:59:32.760 に答える
4

C++11 はthread_localストレージ タイプを指定します。それを使用してください。

AnotherClass::threadSpecificAction()
{
  thread_local MyClass *instance = new MyClass();
  instance->doSomething();
}

オプションの最適化の 1 つは、スレッド ローカル ストレージにも割り当てることです。

于 2015-11-23T14:41:14.340 に答える
3

Windows では、TlsAllocTlsFreeを使用して、スレッドのローカル ストレージにストレージを割り当てることができます。

TLS で値を設定および取得するには、それぞれTlsSetValueTlsGetValueを使用できます。

ここでは、それがどのように使用されるかの例を見ることができます。

于 2011-05-16T18:04:16.940 に答える
2

余談ですが、MSVC++ は VSC++2005 の declspec(thread) をサポートしています

#if (_MSC_VER >= 1400)
  #ifndef thread_local     
    #define thread_local __declspec(thread)
  #endif
#endif

主な問題は (boost::thread_specific_ptr で解決されます) でマークされた変数に ctor または dtor を含めることができないことです。

于 2014-11-01T03:09:11.740 に答える
1

Folly (Facebook オープンソース ライブラリ)には、スレッド ローカル ストレージの移植可能な実装があります。

その著者によると:

pthread_getspecific自明でない型のスレッド ローカル ストレージを改善しました (単一のと同様の速度 pthread_key_tであり、 の 4 倍の速度ですboost::thread_specific_ptr)。

Local Storage Thread のポータブルな実装を探している場合は、このライブラリが適しています。

于 2016-06-22T15:35:15.933 に答える