Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Синхронизация в многопоточности

1.6K
13 сентября 2006 года
Kadet
101 / / 26.03.2003
Доброго времени суток!
Значит есть кусочек консольного приложения.

#include <windows.h>
#include <stdio.h>
//----------------------------------------------

DWORD dwThreadId, dwThreadId2;
DWORD WINAPI ThreadFunc(LPVOID lpCOM);

//====================================
int main(int argc, char* argv[])
{
CreateThread(NULL,0,ThreadFunc, &"1",0,&dwThreadId) ;
CreateThread(NULL,0,ThreadFunc, &"2",0,&dwThreadId2) ;
printf("Start\n");
Sleep(INFINITE);
return 0;
}
//---------------------------------------------
DWORD WINAPI ThreadFunc(LPVOID lpCOM)
{
for(int i = 0 ;i < 10;i++ )
{
Sleep(100);
printf("%s\n",(char*)lpCOM);
}
return 0;
}

По идее результат должен быть как чередование 12 и так 10 раз, но не тут то было.
Вот что выводит: 121212121212121121212.
Откуда взялись две единицы подряд? Поможите, что не так?
398
13 сентября 2006 года
Alexandoros
630 / / 21.10.2005
Нетак то, что синхронизации нету.
http://www.lib.csu.ru/dl/bases/prg/kompress/articles/2001_09_synchronize/
14K
13 сентября 2006 года
wrap
35 / / 02.06.2006
Результат совсем не обязательно должен быть таким как чередование 1 и 2, потому что:
1) в ОС выполняются еще и другие потоки;
2) между твоими потоками отсутствует синхронизация выполнения, поэтому они получают управление в соответствие с алгоритмами планирования потоков в ОС;
3) Sleep(100) вовсе не гарантирует получение процессорного времени потоком через 100 мс после приостановки.
Предполагать, что потоки выполняются по очереди нельзя - это является ошибкой. Применяй синхронизацию потоков, используя соответствующие средства ОС.
1.6K
14 сентября 2006 года
Kadet
101 / / 26.03.2003
[QUOTE=Alexandoros]Нетак то, что синхронизации нету.
http://www.lib.csu.ru/dl/bases/prg/kompress/articles/2001_09_synchronize/[/QUOTE]
Да, доступ к разным обьектам. Но как ещё это назвать.....
1.6K
14 сентября 2006 года
Kadet
101 / / 26.03.2003
[QUOTE=wrap]Результат совсем не обязательно должен быть таким как чередование 1 и 2, потому что:
1) в ОС выполняются еще и другие потоки;
2) между твоими потоками отсутствует синхронизация выполнения, поэтому они получают управление в соответствие с алгоритмами планирования потоков в ОС;
3) Sleep(100) вовсе не гарантирует получение процессорного времени потоком через 100 мс после приостановки.
Предполагать, что потоки выполняются по очереди нельзя - это является ошибкой. Применяй синхронизацию потоков, используя соответствующие средства ОС.[/QUOTE]

Все то оно так, но загвоздка в том что:
- повторные единицы выскочили одновременно(без задержек по времени) это раз.
- единиц одиннадцать вместо дести это два.
- пошагово решить затруднено (при таймауте более секунды все работает как положено).
14K
14 сентября 2006 года
wrap
35 / / 02.06.2006
Может дело в использовании функций стандартной библиотеки ? Для безопасного их использования в многопоточных приложениях потоки следует создавать функцией _beginthreadex.
398
14 сентября 2006 года
Alexandoros
630 / / 21.10.2005
[QUOTE=Kadet]Все то оно так, но загвоздка в том что:
- повторные единицы выскочили одновременно(без задержек по времени) это раз.
- единиц одиннадцать вместо дести это два.
- пошагово решить затруднено (при таймауте более секунды все работает как положено).[/QUOTE]

Ну не буксуй, я ж тебе ссылку дал, просто прочитай. И, кажется в ссылке нету описания критсекций - тогды в мсдн critical section.

_beginthreadex нужен только, если используется single thread run-time. Это связано с мелкими утечками памяти. Надеюсь ты его не используеш. В 8 студии его уже даже в опциях нету.
1.6K
14 сентября 2006 года
Kadet
101 / / 26.03.2003
[QUOTE=Alexandoros]Ну не буксуй, я ж тебе ссылку дал, просто прочитай. И, кажется в ссылке нету описания критсекций - тогды в мсдн critical section.

_beginthreadex нужен только, если используется single thread run-time. Это связано с мелкими утечками памяти. Надеюсь ты его не используеш. В 8 студии его уже даже в опциях нету.[/QUOTE]

Спасибо!!!

EnterCriticalSection(&GlobalCriticalSection);
printf("%s\n",(char*)lpCOM);
LeaveCriticalSection(&GlobalCriticalSection);

помогло :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог