2013-04-20 3 views
1

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

Есть ли библиотека, которая может добиться этого безупречно в ОС Windows?

Я попробовал Open MP, и он дает мне всевозможные странные ошибки и много головной боли, даже с флеш-памятью omp все иногда данные все еще не обновлены, неустойчивые указатели не помогли ни когда частота обращений высоко, поэтому программа становится очень неустойчивой и непоследовательной.

Есть ли библиотеки, которые могут обрабатывать общий и часто обновляемый и доступный массив данных (динамический) лучше? Может ли TBB справиться с этой ситуацией?

+0

C++ Стандартная библиотека. Вы можете передавать общие данные объектам потока при построении. – juanchopanza

+0

Обмен данными между потоками процесса ?! Вам не нужна внешняя библиотека. Передайте данные, такие как объект, переменные, указатели, ... – deepmax

ответ

1

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

WaitForSingleObject(mutexHandle); 
// shared data access & modification 
ReleaseMutex(mutexHandle); 

Если у вас есть доступ к C++ 11, попробуйте использовать std::atomic<T> типы, которые позволяют разделить примитивные типы с атомарная семантика доступа.

2

Нити одного и того же процесса имеют одну и ту же кучу, поэтому память, выделенная на этой куче, может совместно использоваться этими потоками.

Все, что требуется программе, защищает такую ​​«общую» память от одновременного доступа.

Последнее может быть достигнуто с помощью замков, таких как мьютексы.

+0

Я думаю, что проблема заключается в том, что компилятор пытается загрузить некоторые из этих разделяемых данных в регистры, и по какой-то странной причине даже с изменчивой иногда она все еще не может обеспечить согласованность данных среди потоки. – user2188453

+0

@ user2188453: 'volatile' здесь не поможет (читайте здесь: http://software.intel.com/en-us/blogs/2007/11/30/volatile-almost-useless-for-multi-threaded- программирование для более). Защитите параллельный доступ блокировкой. – alk

+0

Я пробовал omp критический и omp атомный, aint они по существу замки? – user2188453

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