Потоки (PThreads) прекращают выполнение и переходят в состояние ожидания - PullRequest
0 голосов
/ 16 января 2011

У меня была проблема, когда мои потоки прекращали выполнение и переходили в состояние ожидания (причина: неизвестна).Ниже приведен псевдокод с последующим объяснением

int arr[1000];
T1
{
tmp = arr[i];
}
T2
{
tmp=arr[i];
}
T3
{
arr[i] = value;
}
Main()
{
spawns of threads and waits for them to finish;
}

Таким образом, единственное, что разделяется между этими потоками, - это массив, T3 записывает в этот массив и T1, T2 считывает из него и использует его для каких-то целей,Когда я выполняю программу, все три потока работают нормально и выполняют то, что от них требуется, но когда я пытаюсь запустить ее в течение более длительных периодов времени, через некоторое время они останавливают выполнение и переходят в состояние ожидания.Потоки все еще находятся в процессе смешивания, но в менее простом состоянии.Я не знаю, почему это происходит, и был бы очень признателен, если бы кто-нибудь смог дать какие-нибудь полезные указания о том, как мне найти решение этой проблемы.

Ответы [ 4 ]

1 голос
/ 16 января 2011

Конечно, в приведенном примере ошибки нет.Настоящая ошибка в вашем коде - где-то еще - это типично для многопоточных приложений, вы не должны фокусироваться только на этом конкретном массиве.Ищите ошибку в другом месте.Даже если вы думаете, что нет ничего более связанного с потоками, где может возникнуть многопоточная тупиковая ситуация, что-то наверняка есть!

0 голосов
/ 19 января 2011

Я собирался сказать, проверьте блокировку и разблокировку мьютекса, особенно при использовании условий, но вы нашли свою проблему.

Кстати .... вам не обязательно использовать мьютекс для чтения или записи значений в общий массив. Проверьте gcc атомарные операции, если вам нужна большая скорость!

0 голосов
/ 19 января 2011

При использовании одного из вызовов внешней библиотеки возникла проблема, из-за которой я перешел в режим самоблокировки.Спасибо всем, кто пытался мне помочь.

0 голосов
/ 16 января 2011

Звучит так, как будто вы страдаете от тупика. Ваши потоки когда-либо содержат более одного мьютекса за раз? (например, pthread_mutex_lock (& ​​mutex1); pthread_mutex_lock (& ​​mutex2);) Если это так, всегда ли они блокируют одновременно удерживаемые мьютексы в одном и том же порядке? Если они этого не сделают, это будет проблемой.

Если поток T1 выполняет вышеупомянутую последовательность блокировки, но поток T2 блокирует mutex2, а затем mutex1 (при этом все еще удерживая mutex2), то это все, что необходимо для того, чтобы вызвать случайный тупик ... что означало бы, что T1 удерживает mutex1 и ожидание доступности mutex2, в то время как T2 одновременно удерживает mutex2 и ожидает mutex2, и оба застряли навсегда. Или, если вам действительно не повезло, тупик может включать цикл из 3 или более мьютексов.

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

Лучше всего было бы запустить вашу программу под отладчиком (например, gdb), а затем, когда он заблокировался, взломать отладчик и распечатать текущую трассировку стека каждого потока (с помощью команды "где") чтобы увидеть, где он заблокирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...