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)