Критические секции...

Тема в разделе "WASM.BEGINNERS", создана пользователем ZamDec, 8 окт 2007.

  1. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    для чего собственно нужен сабж ? Для синхронизации нескольких потоков или только 2х ?
    А если например 5 потоков последовательно сделали запрос на вход в критическую секцию , то они зайдут туда по мере обращения, т.е. по той очереди как они обратились ? Или это совсем не определено ?
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Я, конечно, почти не разбираюсь, но что означает
    ? Если один поток зашел в критическую секцию, то другие не получат управления, пока он не выйдет из нее, и соответственно никакие другие потоки не смогут "последовательно сделать запрос".
    P.S. Знающие, поправьте, если ошибаюсь.
     
  3. ZamDec

    ZamDec New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    23
    Я не об это спросил....
    так, вот на примере :
    Есть 5 потоков. Каждый из них хочет в одно и то же время попасть в критическую секцию. Делает запрос на вход. но успевает зайти только одна сеция, по правилам, предположим первая. Все остальные блокируются. И как бы становятся в очередь... 2 3 4 5 потоки. Когда первый поток выйдет из критической секции, то дальше пойдет 2ой поток или очередь не будет соблюдаться? Мне необходимо узнать, будет ли соблюдаться очередь, т.е. затем идет 2ой, потом 3ий, 4ый и 5ый потоки... или это не так ? Кто первый успел тот и вошел ?
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    ZamDec
    Логично было бы - кто первый запрос послал, тот и попадет. Одновременно это все равно невозможно (в смысле два запроса поступить) IMHO.

    ЗЫ
    На WASM.RU статья есть про синхронизацию, можно там поискать.
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    ZamDec
    Если не ошибаюсь, какой поток получит процессорное время, выбирается планировщиком потоков. И это может и не зависеть от порядка создания потоков. Кроме того никаких
    быть не может (если не говорить о многопроцессорных системах), т.к. процессор всего один. Если один поток вышел из критической секции, то планировщик может продолжить выполнять любой поток.
    В общем пока хоть какой-то ответ, а если это бред, то знающие поправят. :)
    P.S. Знающие, не пинайте сильно, если что не так. :)
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Потоки имеют приоритет:

    http://msdn2.microsoft.com/en-us/library/ms685100.aspx

    По логике вещей, если в очереди на критическую секцию есть несколько потоков, то наверное они "поставятся" в соответствии с приоритетом.
     
  7. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Да, кто успел тот и вошел, очередь соблюдаться не будет, потому что её нет :)

    Смотрим код, а именно на цикл в main:

    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3.  
    4. static CRITICAL_SECTION Sec;
    5.  
    6. DWORD WINAPI Worker(LPVOID lpParameter) {
    7.     int i = 0;
    8.  
    9.     while (i < 10) {
    10.  
    11.         EnterCriticalSection(&Sec);
    12.         printf("%d\n", (DWORD)lpParameter);
    13.         LeaveCriticalSection(&Sec);
    14.         i++;
    15.         Sleep(10);
    16.     }
    17.     return (0);
    18. }
    19.  
    20.  
    21. int main() {
    22.  
    23.     int i;
    24.     HANDLE hThread[5];
    25.     DWORD dwThId;
    26.  
    27.     InitializeCriticalSection(&Sec);
    28.  
    29.     for (i = 0; i < 5; i++) {
    30.         hThread[i] = CreateThread(NULL, 0, Worker, (LPVOID) i, 0, &dwThId);
    31.         if (hThread == NULL) {
    32.             printf("error create threads\n");
    33.             return (-1);
    34.         }
    35.     }
    36.     WaitForMultipleObjects(5, hThread, TRUE, INFINITE);
    37.     return (0);
    38. }
    Представим такую ситуацию: код выполняющий CreateThread(), успел создать один
    поток, и тут операционка прерывает наш цикл и запускает следующий в очереди поток,
    скажем, iexplorer и т.д. Потом очередь доходит до первого созданного потока и...
    о какой очереди тут может быть речь? Её нет.


    Нет, не только двух.
    Есть к примеру три потока, собирающие данные с трех сетевух (хм... ну для примера сгодится :)
    Вот они имеют по сообщению, которое нужно поставить в очередь (вот где очередь! очередь сообщений
    от потоков) для обработки четвертому потоку, который скажем выводит их на экран. Так вот сдесь
    и пригодятся критические секции - поток захватывает секцию, вставляет сообщение в очередь,
    выходит из секции. Таким образом они не нарушат целостность очереди, вставляя свои сообщения
    в неё (меня указатели начала-конца очереди и т.п.).

    Кстати, на однопроцессорной машине вышеприведенный код показывает более-менее "последовательный"
    вход в секции, на двухпроцессорной разброс виден в полный рост.

    [added] Щит, забыл тег кода заюзать.
     
  8. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    http://www.bluebytesoftware.com/blog/default,date,2006-11-28.aspx