2015-04-03 2 views
1

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

threadPool.push_back(std::thread(factor, Ap, Ai, Ax, b, Rs, Q, P, Pinv, n, 0, n, scale, nz)); 

и фактор функции определяются следующим образом:

void factor(int Ap[], int Ai[], double Ax[], double b[], double *Rs, int *Q, int *P, int *Pinv, int n, int k1, int k2, int scale, int nz); 

Тема создана успешно, и я вижу ее в окне потоков визуальной студии (из отладчика). Однако данные массивов в потоке не похожи на данные, отправленные в поток. Кто-нибудь знает, что может быть причиной?

+1

Похоже, вы передали указатель (который по существу является параметром массива), который указал на массив с функциями, а затем вышел из функции, поэтому массив вышел из области действия и был уничтожен. – Sneftel

+0

Да, параметры (Ap, Ai, Ax и b) первоначально определяются как указатели, а затем передаются функциональному коэффициенту как массивы. Не могли бы вы объяснить дальнейший ваш комментарий. – Anas

+0

Похожие программы: http://stackoverflow.com/questions/4264304/how-to-return-an-array-from-a-method – Sneftel

ответ

1

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


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

Самое простое решение вашей проблемы заключается в следующем:

  1. Создать (!!! volatile !!!) булево флаг, не установлено, что (= ложь) и передать его (по ссылке) в вашей теме ,
  2. Заблокируйте выполнение основной темы, пока ваш флаг станет установленным (= true).
  3. Сделайте копию своих массивов в своем потоке, затем установите свой (неустойчивый) флаг (= true).

Вы можете использовать другие synchronization objects, чтобы продолжить игру, чтобы получить право собственности на объект. Например, если вы находитесь на платформе Windows, вы можете создать Event, передать его в свой поток и wait for it without an infinite loop, положив вес на процессорное ядро.

+0

Есть ли способ узнать, что поток завершил получение данных? – Anas

+1

Для этой цели можно использовать изменчивую переменную или объект синхронизации. – mg30rg

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