Димыч |
Отправлено: 16.03.2005, 18:27 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 38
|
Вобщем есть два потока: один читает с консоли другой пишет это в файл , общаются они через общий буфер (переменная типа string). Как организовать доступ так чтобы пока один читает другой ожидает и наоборот?????
Отредактировано Димыч — 16/03/2005, 23:24 |
|
Bond |
Отправлено: 16.03.2005, 18:43 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 142
|
можно использовать двухбуферную систему: один буфер заполняет поток-консоль. При заполнении меняет буфера и дает знать потоку-файлу
|
|
klen |
Отправлено: 16.03.2005, 18:51 |
|
Машинист паровоза
Группа: Участник
Сообщений: 239
|
1. Создаешь критическую секцию InitializeCriticalSection ()
2. В каждом потоке обрамляешь критические операции к общим данным
CODE |
EnterCriticalSection(...); // блокирует секцию для всех остальных потоков, если она заблокирована то ждет пока не разблокируется
.... действия с данными
LeaveCriticalSection(...); // разблокирует секцию для остальных потоков
|
3. Удалить критическую секцию DeleteCriticalSection
4. Подробности в справке к билдеру в разделе Syncrinized function
The following functions are used in synchronization.
CancelWaitableTimer
CreateEvent
CreateMutex
CreateSemaphore
CreateWaitableTimer
DeleteCriticalSection
EnterCriticalSection
GetOverlappedResult
InitializeCriticalSection
InterlockedCompareExchange
InterlockedDecrement
InterlockedExchange
InterlockedExchangeAdd
InterlockedIncrement
LeaveCriticalSection
MsgWaitForMultipleObjects
MsgWaitForMultipleObjectsEx
OpenEvent
OpenMutex
OpenSemaphore
OpenWaitableTimer
PulseEvent
QueueUserAPC
ReleaseMutex
ReleaseSemaphore
ResetEvent
SetEvent
SetWaitableTimer
SignalObjectAndWait
TryEnterCriticalSection
WaitForMultipleObjects
WaitForMultipleObjectsEx
WaitForSingleObject
WaitForSingleObjectEx
Отредактировано klen — 16/03/2005, 18:51 |
|
Димыч |
Отправлено: 16.03.2005, 23:20 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 38
|
Попробовал с критическими секциями — не получается
CODE |
void __fastcall Reader::Execute()
{
while(true)
{
EnterCriticalSection(§ion);
Abs->Read();
LeaveCriticalSection(§ion);
}
|
CODE |
while(true)
{
EnterCriticalSection(§ion);
Abs->Write();
LeaveCriticalSection(§ion);
}
|
Дело в том что поток успевает войти в критическую секцию за своё процессорное время несколько раз. А соответственно выводит он в файл примерно 7-8 одинаковых строк за раз. |
|
Ajgor |
Отправлено: 11.04.2005, 16:08 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 23
|
Дополнительно можно устанавливать семафор или мьютекс для сигнализации. Что-то типа: "Я уже записал ". |
|