Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
cetrael
60 / 5 / 3
Регистрация: 01.10.2011
Сообщений: 93
#1

Работа с критическими секциями

23.09.2012, 18:24. Просмотров 770. Ответов 5
Метки нет (Все метки)

Разбираюсь с потоками, пытаюсь сделать синхронизацию:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <windows.h>
#include <stdio.h>
CRITICAL_SECTION cs;
HANDLE hThr;
unsigned long uThrID;
 
void Thread( void* pParams )
{ 
    int i, num = 0;
    while (1)
    { 
        EnterCriticalSection( &cs );
        printf("a");
        LeaveCriticalSection( &cs );
        
    }
}
 
int main( void )
{ 
    InitializeCriticalSection( &cs );
    hThr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,NULL,0,&uThrID);
    while(1)
    {
        EnterCriticalSection( &cs );
        printf("b");
        LeaveCriticalSection( &cs );
        
    }
    return 0;
}
Почему потоки выполняются не очередно?
На выходе получаем aaababababbb и т.д.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2012, 18:24
Ответы с готовыми решениями:

Работа с критическими секциями
Мое приложение (еще не готово) имеет ошибки (не все еще исправил)... Главные...

Работа с критическими секциями
Необходимо, используя механизм работы критических секций и два потока с циклами...

Работа с критическими секциями
Пытаюсь синхронизировать 2 потока: char TempWord; FILE *in1; FILE *in2;...

Как работать с критическими секциями?
Нужно чтобы несколько потоков выдавало инфу в один ком-порт.Для этого пытаюсь...

Научите меня обращаться с критическими секциями
С критическими СЕКЦИЯМИ, конечно же Здравствуйте, помогите мне, пожалуйста....

5
alkagolik
Заблокирован
24.09.2012, 00:02 #2
cetrael, использование критических секций подразумевает общий разделяемый потоками ресурс, например глобальный массив, и доступ к нему в любой момент времени только для одного из потоков. вот так должно работать. Но все равно на мой взгляд подход топорный и лучше синхронизировать с помощью mutex, semaphores.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <windows.h>
#include <stdio.h>
CRITICAL_SECTION cs;
HANDLE hThr;
unsigned long uThrID;
char ch;
 
void Thread( void* pParams )
{
    int i = 100, num = 0;
    while (i--)
    {
        EnterCriticalSection( &cs );
        ch = 'a';
        printf("%c", ch);
        LeaveCriticalSection( &cs );
 
    }
}
 
int main( void )
{
    int i = 100;
    InitializeCriticalSection( &cs );
    hThr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,NULL,0,&uThrID);
    while(i--)
    {
        EnterCriticalSection( &cs );
        ch = 'b';
        printf("%c", ch);
        LeaveCriticalSection( &cs );
 
    }
    return 0;
}

Не по теме:

вопрос касается программирования для windows. Наверное лучше туда кинуть топик


еще. требовать ввод-вывод на каждой итерации не совсем разумно (скорость работы режимов сильно разнится), логично паковать данные в буфер и потом один раз распечатать его.
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
24.09.2012, 00:14 #3
Цитата Сообщение от cetrael Посмотреть сообщение
Почему потоки выполняются не очередно?
На выходе получаем aaababababbb и т.д.
потому что существует thread scheduler, который переключает потоки
каждому потоку дается квант исполнения, за который он может несколько раз пройтись в цикле

вообще данная схема ни разу не предполагает поочередного выполнения
если оно требуется, то оно выполняется по-другому
0
cetrael
60 / 5 / 3
Регистрация: 01.10.2011
Сообщений: 93
24.09.2012, 00:28  [ТС] #4
Твой код тоже не дал желаемого результата:

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbaДля продолжения нажмите любую клавишу . . .

Я ожидал ababababababab увидеть
И да, а разве мьютексы и семафоры тоже не общие ресурсы делят?

Добавлено через 1 минуту
Цитата Сообщение от alex_x_x Посмотреть сообщение
если оно требуется, то оно выполняется по-другому
Каким образом?
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
24.09.2012, 00:56 #5
общий смысл

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// thread 1
while (1) {
  lock (m1);
  /* make work */
  unlock (m2);
}
 
// thread 2
while (1) {
  lock (m2);
  /* make some work */
  unlock (m1);
}
 
// init
 
init (m1);
init (m2);
lock (m2);
start_thread_1();
start_thread_2();
Так как в винде критические секции и мьютексы рекурсивные (те поток может залочить уже залоченный мьютекс, если он был им же захвачен) - придется делать на семафорах
в posix-системах можно воспользоваться нерекурсивными мьютексами
0
alkagolik
Заблокирован
24.09.2012, 04:00 #6
Цитата Сообщение от cetrael Посмотреть сообщение
И да, а разве мьютексы и семафоры тоже не общие ресурсы делят?
не, но в Вашем примере потоки вообще не имеют общих ресурсов. По крайней мере именно это я хотел подчеркнуть. А так же то, что операции ввода-вывода очень медлительны (ведь потоки нам нужны для выигрыша драгоценных тактов процессора, а не просто для математической головоломки).
А вот из этого
Цитата Сообщение от alex_x_x Посмотреть сообщение
Так как в винде критические секции и мьютексы рекурсивные
можно заключить что эти два варианта не подходят. Остаются еще парочка - это events, smeaphores, timers... короче вот http://wm-help.net/books-online/print-page/59464/59464.html глава 9.
0
24.09.2012, 04:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2012, 04:00

Не получается синхронизировать через мьютексы (с критическими секциями работает)
Не могу синхронизировать при помощью мьютекса, с критическими секциями все...

Помогите с критическими секциямию. Не работают!!!
&lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt &lt;SPAN lang=EN-US...

Переход между секциями
Помогите плз не могу сделать такие переходы кто знает как?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru