2011-06-23 2 views
0

Это вопрос с потоками, в котором я в основном начал создавать поточную библиотеку. Мой прецедент выглядит следующим образом:О потокобезопасности с использованием QThreadStorage

struct <> 
    { 

     int thread_specific_value; 
} 

1) Например, спиновые 5 нитей.

2) Каждый поток выполняет операцию и сохраняет thread_specific_value в вышеуказанной структуре данных, например. Это динамически выделяется при инициализации каждого потока и добавляется в QThreadStorage.

3) Как только все потоки возвращаются в основной поток, мне нравится получать доступ к значениям errno всех потоков и выполнять некоторую обработку. Прежде чем я удалю поток из основного потока, могу ли я получить информацию о его данных хранения и сохранить в конкретном хранилище основного потока.

В двух словах, как я могу перебирать через QThreadStorage все данные, зависящие от потока, и выполнять некоторую обработку из основного потока?

ответ

3

Данные, хранящиеся в QThreadStorage, доступны только из потока, который помещен там. Период. Если вы хотите получить доступ к тем же данным из других потоков, вы должны сохранить их дополнительно в другом месте. В частности, конкретное значение потока уничтожается при выходе потока; если вы хотите сохранить значение, сохраните его где-нибудь до выхода потока.

Короче говоря, не пытайтесь использовать QThreadStorage для межпоточной связи. Это не то, для чего это нужно.

+0

Спасибо за ваш ответ. Как я уже говорил, я не удаляю нить. Так, согласно документации, данные, зависящие от потока, не уничтожаются. Есть ли какая-либо другая пользовательская структура данных хранения потоков с открытым исходным кодом, которую я могу использовать, которая может использовать эту доступность? – Kartlee

+1

«QThreadStorage берет на себя ответственность за данные (которые должны быть созданы в куче с новыми) и удаляет их, когда поток выходит, как обычно, так и через завершение». - когда он завершается, а не когда он удаляется. Нетрудно катить собственный метод передачи данных из потока, хотя, и есть достаточная разница в случаях использования, что я не знаю ни одного действительно стандартизованного метода ... (плюс разоблачение TLS - очень редкий случай использования. .) – bdonlan

+0

Мы по-прежнему можем использовать QThreadStorage для определенного вида межпротокольной связи. Скажем, чтобы пометить нить каким-либо маркером, который распознается общей функцией. Я использую его для распознавания «имени» потока, в котором работает код. – AlexanderVX

Смежные вопросы