LINUX.ORG.RU

pthread_murex_lock


0

1

Приветствую.
Есть два потока. Один поток слушает unix сокет, второй inet сокет. Каждый поток локает одну переменную, переданную в оба потока. Когда луна входит в фазу сатурна, когда он находится в созвездие близница, pthread_mutex_lock в потоке для прослушки inet сокета «замирает» и уже не отмирает. Вопрос почему и как с этим бороться. Это происходит в среднем в 20% случаев и только на моем компе (проверялось на 2 компах), причом замирает всегда поток с inet сокетом.
http://khpi-iip.mipk.kharkiv.edu/library/spo/spolab2/man/_pthread_mutex_lock....
Написано, что он может переводить вызвавшую нить в ожидание, но не сказано как это избежать\убрать если уже перешла.

Спасибо за внимание.

★★

В заголовке опечатка mutex

DDR ★★
() автор топика
Ответ на: комментарий от pathfinder

Найти его щас не могу... Ну а как еще передать переменную в точку входа для потока переменную? Не глобальную ж ее делать.

DDR ★★
() автор топика
Ответ на: комментарий от pathfinder

Работает. До завтра потещу, если не отпишусь значит заработало, просто я хз в каком случае оно перестает работать.
Если честно, то раз 10 читал про указатели и ссылки, но когда такой замес начинается в них я теряюсь:(

DDR ★★
() автор топика
Ответ на: комментарий от DDR

Про вот это уже сказали. Еще смущает уничтожение мьютекса до завершения тредов:

    pthread_mutex_destroy(&mutex_p);	//destroy mute
    pthread_exit(&thread_unix);		//exit thread for UNIX
    pthread_exit(&thread_inet);		//exit thread for Internet
kulti ★★
()
Ответ на: комментарий от kulti

И вообще использование pthread_exit() в данном случае и может привести к дедлоку, ибо man: «When a thread terminates, process-shared resources (e.g., mutexes, condition variables, semaphores, and file scriptors) are not released, and functions registered using atexit(3) are not called.»

kulti ★★
()
Ответ на: комментарий от kulti

Ок, спасибо.
А чего-нибудь посоветуете почитать про ссылки и указатели, чтоб разжевано было хорошо и сложные примеры были нормально разобраны?

DDR ★★
() автор топика
Ответ на: комментарий от DDR

>А чего-нибудь посоветуете почитать про ссылки и указатели,

Почитай хорошую книжку по ассемблеру.

pathfinder ★★★★
()
Ответ на: комментарий от DDR

Я обычно передаю в тред указатель на структуру с нужными данными(или на класс), и там же дополнительное поле bool stopped. Соотвественно в треде while(!param->stopped), а остановка примерно так делается:

param->stopped = true;
void* res;
pthread_join(id, &res);

kulti ★★
()
Ответ на: комментарий от DDR

Даже не знаю, что посоветовать... Загуглить «указатели и ссылки» и читать до просветления, разве что.

kulti ★★
()
Ответ на: комментарий от DDR
struct ThreadParam
{
  int stopped
};

void* thread(void* arg)
{
  struct ThreadParam* param = (struct ThreadParam*)arg;

  while(!param->stopped)
  {
  ...
  }

  return NULL;
}

int main()
{
  pthread_t tid;
  struct ThreadParam param;

  param.stopped = false;
  pthread_create(&tid, NULL, thread, (void*)&param);

  ...

  param.stopped = true;
  void* res;
  pthrad_join(tid, &res);
}
kulti ★★
()
Ответ на: комментарий от kulti

Спасибо большое!
Многое понял)

DDR ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.