Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > WinAPI
Перезагрузить страницу Выборочная синхронизация потоков
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
sercher81 sercher81 вне форума
Новичок
 
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.06.2011
По умолчанию Выборочная синхронизация потоков - 27.06.2011, 06:58

Здравствуйте, есть потоки работающие с общим двунаправленным связанным списком, все потоки кроме одно только читают информацию из списка , один поток "основной" добавляет и удаляет записи из списка, сейчас я синхронизирую чтение/запись через мутекс который захватывается всеми читающими потоками и также основным потоком при необходимости удаления удалении записи. По идеи все читающие потоки должны синхронизироваться только с "основным" потоком но не между собой, так как ошибка доступа возможна лишь при удалении записи и одновременном чтении из нее. Вот и возник вопрос как синхронизировать доступ к области памяти только между "Основным" потоком и всеми читающими, т.е. производить блокировку читающих потоков только при необходимости удаления.

Сейчас делаю так:

Все читающие потоки:
В начале чтения ждем захвата общего мутекса
читаем
освобождаем мутекс

"Основной поток"
чтение и добавление производим без захват мутекса
при удалении захватываем мутекс.
удаляем
освобождаем мутеск.

Как видно при работе по такой схеме все потоки чтения синхронизируются не только с основным потоком но и между собой, из-за чего тратиться много времени на ожидание перед чтением.
Ответить с цитированием
  (#2 (permalink)) Старый
<name> <name> вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.01.2011
По умолчанию 13.07.2011, 21:17

c Код:
typedef struct _WRLOCK
{
    CRITICAL_SECTION cs;
    volatile DWORD dwThreadCounter;
    HANDLE hEvent;
}*PWRLOCK;

PWRLOCK CreateWRLock()
{
    PWRLOCK pRet = (PWRLOCK) malloc(sizeof(struct _WRLOCK));
    if (pRet)
    {
        pRet->hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (!pRet->hEvent)
        {
            free(pRet);
            return NULL;
        }
        InitializeCriticalSection(&pRet->cs);
        pRet->dwThreadCounter = 0;
    }
    return pRet;
}
VOID CloseWRLock(PWRLOCK pLock)
{
    CloseHandle(pLock->hEvent);
    DeleteCriticalSection(&pLock->cs);
    free(pLock);
}

BOOL LockRead(PWRLOCK pLock)
{
    EnterCriticalSection(&pLock->cs);
    InterlockedIncrement(&pLock->dwThreadCounter);
    LeaveCriticalSection(&pLock->cs);
    return TRUE;
}
BOOL LockWrite(PWRLOCK pLock)
{
    EnterCriticalSection(&pLock->cs);
    if (pLock->dwThreadCounter && WaitForSingleObject(pLock->hEvent, INFINITE) == WAIT_FAILED)
    {
        LeaveCriticalSection(&pLock->cs);
        return FALSE;
    }
    return TRUE;
}
BOOL UnlockRead(PWRLOCK pLock)
{
    if (!InterlockedDecrement(&pLock->dwThreadCounter))
    {
        if (!SetEvent(pLock->hEvent))
            return FALSE;
    }
    return TRUE;
}
BOOL UnlockWrite(PWRLOCK pLock)
{
    LeaveCriticalSection(&pLock->cs);
    return TRUE;
}
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация потоков стандарте C/C++ Odin_KG С/С++ 6 25.04.2011 14:16
Синхронизация. Extensa Любые вопросы от новичков 4 17.04.2011 12:05
Синхронизация потоков как сделать Sergey727 C++ на Unix 1 08.12.2010 12:32
Создание потоков на C++ Builder vilru C++ Builder 6 25.02.2009 12:23
Синхронизация потоков в MFC Dialog Based Application приложении Sash&#39;Ok&#33; Visual C++ 8 17.05.2007 16:00
Как организовать пул потоков Leonidos_ С/С++ 4 04.05.2007 12:49
Синхронизация потоков на приложении Fuud Delphi 5 11.02.2007 18:18
синхронизация двух БД Виталик MSSQL Server 2 04.09.2006 05:29
Создание потоков в приложении |ina C++ Builder 9 15.07.2006 17:46
Как работать с замораживанием потоков Smolnyj WinAPI 14 17.03.2006 21:52
Выборочная загрузка альбомов dream-girl PHP 2 06.03.2006 19:19
Получение видео потоков Anonymous Программирование графики 3 17.01.2004 19:29



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов