Создает условную переменную для использования в синхронизации потоков
Синтаксис
Использование
result = CondCreate
Возвращаемое значение
Дескриптор вновь созданной условной переменной, или нулевой указатель (0) в
случае сбоя.
Описание
После того, как условное выражение создано и запускаются потоки, один или
несколько из них могут быть остановлены условно с помощью
CondWait
(они будут остановлены до некоторых других потоков).
CondSignal
может перезапустить ожидающий поток.
CondBroadcast
может использоваться для перезапуска всех потоков, ожидающих условие. В
конце программы
CondDestroy
должна быть использована во избежание утечки ресурсов операционной системы.
Пример
''
'' сделать вновь созданные потоки, заставить ждать до тех
пор, пока все потоки не будут готовы, а затем начать их все сразу
''
Dim Shared hcondstart As Any Ptr
Dim Shared hmutexstart As Any Ptr
Dim Shared start As Integer = 0
Dim Shared threadcount As Integer
Dim Shared hmutexready As Any Ptr
Dim Shared hcondready As Any Ptr
Sub mythread(ByVal id_ptr As Any Ptr)
Dim id As Integer = Cast(Integer, id_ptr)
Print "Thread #" & id & " is waiting..."
'' сигнал, что этот поток готов
MutexLock hmutexready
threadcount += 1
CondSignal hcondready
MutexUnlock hmutexready
'' ждать сигнал начала
MutexLock hmutexstart
Do While start = 0
CondWait hcondstart, hmutexstart
Loop
'' Теперь этот поток владеет
блокировкой hmutexstart
MutexUnlock hmutexstart
'' распечатать числа из этого
потока
For i As Integer = 1 To 40
Print id;
Next i
End Sub
Dim threads(1 To 9) As Any Ptr
hcondstart = CondCreate()
hmutexstart = MutexCreate()
hcondready = CondCreate()
hmutexready = MutexCreate()
threadcount = 0
For i As Integer = 1 To 9
threads(i) = ThreadCreate(@mythread, Cast(Any Ptr, i))
If threads(i) = 0 Then
Print "unable to create thread"
End If
Next i
Print "Waiting until all threads are ready..."
MutexLock(hmutexready)
Do Until threadcount = 9
CondWait(hcondready, hmutexready)
Loop
MutexUnlock(hmutexready)
Print "Go!"
MutexLock hmutexstart
start = 1
CondBroadcast hcondstart
MutexUnlock hmutexstart
'' Дождемся завершения всех потоков
For i As Integer = 1 To 9
If threads(i) <> 0 Then
ThreadWait threads(i)
End If
Next i
MutexDestroy hmutexready
CondDestroy hcondready
MutexDestroy hmutexstart
CondDestroy hcondstart
Различия платформ
- Condcreate не доступна в версии DOS FreeBASIC, потому что
многопоточность не поддерживается ядром DOS, не использующим
расширитель.
Различия диалектов
Отличия от QB
См. также