2014-01-19 8 views
0

Я работаю над своим хобби-проектом, играми в онлайн-шахматы, основанным на многопоточном сервере iocp.EnterCriticalSection и большое количество общих данных на многопоточном сервере

Ниже структура совета и зрителя:

typedef struct _board { 
      .... 
     PPER_viewer    Viewerlist; 
      ... 
    } board, *PPER_board; 

    typedef struct _viewer { 
    SOCKET sc; 
    struct _viewer *pCtxtBack; 
    struct _viewer *pCtxtForward; 
    } viewer, *PPER_viewer; 

Viewerlist в правлении структура представляет собой начало двусвязного списка просмотра. Список обновляется с помощью структуры зрителя, когда игроки садятся/до определенной доски. Я также использую Viewerlist, чтобы отправить кусочек движения всем зрителям за столом. Из-за многопоточности я использую EnterCriticalSection в списке просмотра.

Мое замешательство: как бороться с ситуацией, когда на моем сервере 10 открытых плат? Кажется, нецелесообразно использовать одну и ту же вводную секцию для всех открытых плат? Например, в случае 30 открытых плат. Должен ли я сделать 30 разделенных Entercriticalsection для каждой платы?

Заранее благодарю за вашу помощь.

ответ

1

Вам нужна индивидуальная связь между объектом критического раздела и совместно используемыми данными. Поэтому, если платы независимы друг от друга, тогда у вас есть один критический раздел на доске.

+0

Следует ли инициализировать большое количество критической секции с помощью InitializeCriticalSection при запуске сервера, создать какой-то пул или массив из них и взять критический раздел из пула, когда это необходимо? – maciekm

+0

Нет. Инициализируйте их при создании общих данных. Завершите их, когда сработает общая информация. –