PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Программирование на PureBasic » Помогите разрешить DeadLock


Помогите разрешить DeadLock

Сообщений 1 страница 3 из 3

1

Код:
Procedure Show_Log(*par)
...
EndProcedure ;---------------------------------------
Procedure Write_to_Log(str$)
  If LockMutex(mtx_Edit_Log)
    AddElement(gLogList$())
    gLogList$()=str$
    UnlockMutex(mtx_Edit_Log)
  EndIf
EndProcedure ;---------------------------------------
Procedure Receiver(*Par) ;приемник
    gReceiverOK=#True ; сообщить о старте
    Write_to_Log(#CRLF$+"Receiver Started")
    Repeat
   ....
EndProcedure ;---------------------------------------
Procedure Transmitter(*Par) ;передатчик
    gTransmitterOK=#True
    Write_to_Log(#CRLF$+"Transmitter Started")
    Repeat
   ....
EndProcedure ;---------------------------------------

последовательно запускаются потоки Receiver(), Transmitter(), Show_Log()
Show_Log() с периодом 100 опрашивает gLogList$(). Если gLogList$() не пустой - то LockMutex(mtx_Edit_Log) и опустошает gLogList$() с выводом на экран.
Специальная вставка показывает что Show_Log() работает (крутит цикл).
А Receiver() и Transmitter() не крутят свои циклы.
Но стоит убрать LockMutex(mtx_Edit_Log) из Write_to_Log(str$) - Receiver() и Transmitter() начинают крутить свои циклы.
Т.е. происходит DeadLock при одновременном вызове "Write_to_Log(str$) с  LockMutex(mtx_Edit_Log)" из разных потоков.
Чего - по моему разумению - быть не должно.
Что я делаю не так?

P.S.
сделал отдельные процедуры Write_to_Log1(str$) и Write_to_Log2(str$) которые вызываются соответственно только из Receiver() и Transmitter().
Т.е. Write_to_Log1(str$) никогда не вызывается одновременно из разных потоков. И Write_to_Log2(str$) тоже.
Результат не изменился - DeadLock.

P.S2.
убрал LockMutex(mtx_Edit_Log) из Write_to_Log(str$) - стало клинить Show_Log() на LockMutex(mtx_Edit_Log)  :'(
как будто не работает сама функция LockMutex.
доп.инфа: EnableThread и Global mtx_Edit_Log=CreateMutex()

Отредактировано SadStar (08.04.2016 10:49:18)

0

2

SadStar написал(а):

If LockMutex(mtx_Edit_Log)

Разве в справке написано что LockMutex что-то возвращает?

Код:
mtx_Edit_Log = CreateMutex()
Debug LockMutex(mtx_Edit_Log)

0

3

И действительно.
Подвела увереность что "сто раз так делал" после очередного перерыва.

Думаю - нужно грохнуть это ветку как малосодержательную

Отредактировано SadStar (11.04.2016 02:50:17)

0


Вы здесь » PureBasic - форум » Программирование на PureBasic » Помогите разрешить DeadLock