C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Работа с потоками, синхронизация
Димыч
  Отправлено: 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



Дополнительно можно устанавливать семафор или мьютекс для сигнализации. Что-то типа: "Я уже записал smile.gif".

Вернуться в Вопросы программирования в C++Builder