Russian Qt Forum
Ноябрь 22, 2024, 19:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] OpenMP и деление дерева  (Прочитано 12949 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Май 02, 2010, 18:51 »

- нитка 1 занимается делением (DivideNode)
- нитка 2 ждет на семафоре

Деление закончено, новый нод добавлен, счетчик семафора = 1. Но ведь нет никаких гарантий,  что после этого именно нитка 2 снимется с семафора и захватит мутекс. Это может быть опять нитка 1, которая продолжает крутить свой while.

Пусть нитка 1 опять захватила мутекс. Тогда если нитка 2 успела сняться с семафора, она ждет на мутексе (захваченном ниткой 1).  А нитка 1 (ведь есть ноды для деления) отправляется ждать на семафоре, закрытом ниткой 2. Имеем deadlock
Записан
spectre71
Гость
« Ответ #16 : Май 02, 2010, 19:08 »

- нитка 1 занимается делением (DivideNode)
- нитка 2 ждет на семафоре

Деление закончено, новый нод добавлен, счетчик семафора = 1. Но ведь нет никаких гарантий,  что после этого именно нитка 2 снимется с семафора и захватит мутекс. Это может быть опять нитка 1, которая продолжает крутить свой while.

Пусть нитка 1 опять захватила мутекс. Тогда если нитка 2 успела сняться с семафора, она ждет на мутексе (захваченном ниткой 1).  А нитка 1 (ведь есть ноды для деления) отправляется ждать на семафоре, закрытом ниткой 2. Имеем deadlock

Не имеем. Поскольку перед попаданием на семафор нитка 1 разблокирует мутекс:

    if(!sem.tryAcquire()) {
      if(!ActiveThreadCount && !GetNodeCount()) {
        locker.unlock();
        sem.release();
        break;                 
      } else {
        locker.unlock(); // нитка 1 разблокирует мутекс и только после этого попадает на семафор
        sem.acquire();
        locker.lock(); // нитка 2 снялясь с семафора ждет на мутексе
      }
    }


Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Май 03, 2010, 00:08 »

        locker.unlock(); // нитка 1 разблокирует мутекс и только после этого попадает на семафор
        sem.acquire();
Убедили  Улыбающийся  Помечаю как "решено". Реализация правда не блещет (lock на мутексе + tryAcquire + acquire) но это не принципиально
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.162 секунд. Запросов: 22.