0

次のような非静的メンバーのスレッドローカル変数をシミュレートしたい:

template< typename T, unsigned int tNumThread >
class ThreadLocal
{
private:

protected:
    T mData[tNumThread];

    unsigned int _getThreadIndex()
    {
        return ...; // i have a threadpool and each thread has an index from 0 to n
    }

public:
    ThreadLocal() {};
    ~ThreadLocal() {};

    T& operator ->()
    {
        return mData[_getThreadIndex()];
    }
    ...
};

mDataしかし問題は、実行時にスレッドの数が決定され、ヒープから割り当てる必要があることです。

上記のように、ヒープからの割り当てを使用せずに通常の配列を使用する方法はありますか?

4

2 に答える 2

0

私は提案します:

std::unordered_map<std::thread::id, T, stackalloc> myTLS;

すべてのアクセスをグローバルにロックするか、事前に人口を準備し、後で読み取り専用でアクセスします。

スタック アロケータと組み合わせて使用​​できます。

typedef short_alloc<pair<const thread::id, T>, maxthrds> stackalloc;

https://howardhinnant.github.io/stack_alloc.html

別の解決策が必要な場合は、ここで次のことができます。

struct Padder
{
    T t;
    char space_[128 - sizeof(T)];  // if sizeof(T) >= 128 just don't include the padding.
};

std::array<Padder, maxthreads> myTLS;

MESI のボトルネックのないアクセスのために。
このメソッドを使用して、この配列内の独自のインデックスでスレッドを追跡することに注意する必要があります。

于 2016-06-15T03:25:04.880 に答える