Синхронизация в многопоточности
Значит есть кусочек консольного приложения.
#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.
Откуда взялись две единицы подряд? Поможите, что не так?
Нетак то, что синхронизации нету.
1) в ОС выполняются еще и другие потоки;
2) между твоими потоками отсутствует синхронизация выполнения, поэтому они получают управление в соответствие с алгоритмами планирования потоков в ОС;
3) Sleep(100) вовсе не гарантирует получение процессорного времени потоком через 100 мс после приостановки.
Предполагать, что потоки выполняются по очереди нельзя - это является ошибкой. Применяй синхронизацию потоков, используя соответствующие средства ОС.
http://www.lib.csu.ru/dl/bases/prg/kompress/articles/2001_09_synchronize/[/QUOTE]
Да, доступ к разным обьектам. Но как ещё это назвать.....
1) в ОС выполняются еще и другие потоки;
2) между твоими потоками отсутствует синхронизация выполнения, поэтому они получают управление в соответствие с алгоритмами планирования потоков в ОС;
3) Sleep(100) вовсе не гарантирует получение процессорного времени потоком через 100 мс после приостановки.
Предполагать, что потоки выполняются по очереди нельзя - это является ошибкой. Применяй синхронизацию потоков, используя соответствующие средства ОС.[/QUOTE]
Все то оно так, но загвоздка в том что:
- повторные единицы выскочили одновременно(без задержек по времени) это раз.
- единиц одиннадцать вместо дести это два.
- пошагово решить затруднено (при таймауте более секунды все работает как положено).
Может дело в использовании функций стандартной библиотеки ? Для безопасного их использования в многопоточных приложениях потоки следует создавать функцией _beginthreadex.
- повторные единицы выскочили одновременно(без задержек по времени) это раз.
- единиц одиннадцать вместо дести это два.
- пошагово решить затруднено (при таймауте более секунды все работает как положено).[/QUOTE]
Ну не буксуй, я ж тебе ссылку дал, просто прочитай. И, кажется в ссылке нету описания критсекций - тогды в мсдн critical section.
_beginthreadex нужен только, если используется single thread run-time. Это связано с мелкими утечками памяти. Надеюсь ты его не используеш. В 8 студии его уже даже в опциях нету.
_beginthreadex нужен только, если используется single thread run-time. Это связано с мелкими утечками памяти. Надеюсь ты его не используеш. В 8 студии его уже даже в опциях нету.[/QUOTE]
Спасибо!!!
EnterCriticalSection(&GlobalCriticalSection);
printf("%s\n",(char*)lpCOM);
LeaveCriticalSection(&GlobalCriticalSection);
помогло :)