Как создать поток локальной памяти без синхронизации - PullRequest
0 голосов
/ 08 января 2019

Я хочу дать каждому потоку, который входит в функцию, объект, который она будет использовать (в данном случае он представляет страницу памяти). Это сделано для того, чтобы сократить синхронизацию, в которой моя программа не работает, поэтому в идеале она не должна блокировать мьютекс.

минималистский пример того, что я пытаюсь сделать (std::map не может быть вставлен одновременно, но если бы это было возможно, это сделало бы именно то, что мне нужно):

// multiple threads can access this, they should be able to do so without synchronization
void addJob(ThreadMemory * mem){

    // straight-forward, but undefined when used concurrently:

    static std::map<std::thread::id, ThreadMemoryPool> memPool;
    memPool[std::this_thread::get_id()].addRef(mem);

    // if memPool has no node for this thread, one is inserted,
    // every thready would be guaranteed one ThreadMemoryPool object

}

Есть ли способ достичь того же ... общего эффекта, которого хотели бы достичь эти две линии без блокировки?

1 Ответ

0 голосов
/ 08 января 2019

Ваше решение будет использовать один и тот же memPool для всех потоков, и его модификация не является поточно-ориентированной.

Если вы хотите иметь локальный экземпляр потока memPool, вы должны объявить его с помощью спецификатор thread_local:

thread_local std::map<std::thread::id, ThreadMemoryPool> memPool;

В этом случае каждый поток будет использовать свой собственный экземпляр memPool.

...