Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2011, 03:51   #1
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Проблема в том, что у вас потоки освобождают мюьексы, которыми они не владеют. Так делать нельзя.

Скорей всего, все ваши WaitForSingleObject() возвращают WAIT_ABANDONED:

Цитата:
The specified object is a mutex object that was not released by the thread that owned the mutex object before the owning thread terminated. Ownership of the mutex object is granted to the calling thread and the mutex state is set to nonsignaled.
И ещё, вместо создания 300 потоков, разумнее было бы перенести цикл внутрь потоков.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 18.11.2011 в 04:29. Причина: фигассе форум заглючило
veniside вне форума Ответить с цитированием
Старый 18.11.2011, 03:51   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

- -
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 18.11.2011 в 03:59.
veniside вне форума Ответить с цитированием
Старый 18.11.2011, 05:28   #3
LockHeart
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 14
По умолчанию winapi, синхронизация потоков

Пытаюсь решить, на первый взгляд, несложную задачу... нужно создать 3 потока, каждый из которых записывает свое число в файл (1, 2, 3), и при помощи мьютексов синхронизировать их.

В WinMain создаю три мьютекса, затем 3 потока (потоки завернуты в цикл For, просто для того, чтобы в файл записывалось несколько итераций)

Код:
hMutex1 = CreateMutex(NULL, FALSE, NULL);
    hMutex2 = CreateMutex(NULL, TRUE, NULL);
	hMutex3 = CreateMutex(NULL, TRUE, NULL);

for (i=0; i<100; i++)
{
 aThread[0] = CreateThread( 
					 NULL,       
					 0,         
					 (LPTHREAD_START_ROUTINE) func1,
					 NULL,      
					 0,       
					 &ThreadID);

aThread[1] = CreateThread( 
					 NULL,       
					 0,          
					 (LPTHREAD_START_ROUTINE) func2, 
					 NULL,       
					 0,         
					 &ThreadID); 

aThread[2] = CreateThread( 
					 NULL,       
					 0,          
					 (LPTHREAD_START_ROUTINE) func3, 
					 NULL,       
					 0,         
					 &ThreadID); 


		WaitForMultipleObjects(3, aThread, TRUE, INFINITE);
}
Сами функции для потоков имеют следующий вид:

Код:
DWORD WINAPI func1()
{
WaitForSingleObject(hMutex1, INFINITE);
	OutFile << a;
	ReleaseMutex(hMutex2);
return 0;
}

DWORD WINAPI func2()
{
WaitForSingleObject(hMutex2, INFINITE);
	OutFile << b;
	ReleaseMutex(hMutex3);
return 0;
}

DWORD WINAPI func3()
{
WaitForSingleObject(hMutex3, INFINITE);
	OutFile << c;
	ReleaseMutex(hMutex1);
return 0;
}
По какой-то, пока не понятной мне причине, записанные в файл данные имеют вид не 123123123, а представляют собой совершенно случайную последовательность из этих цифр(213213231213..). Подскажите, пожалуйста, что я делаю не так, почему потоки не синхронизируются?)

Последний раз редактировалось LockHeart; 18.11.2011 в 05:58.
LockHeart вне форума Ответить с цитированием
Старый 18.11.2011, 12:25   #4
LockHeart
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 14
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
Проблема в том, что у вас потоки освобождают мюьексы, которыми они не владеют. Так делать нельзя.

И ещё, вместо создания 300 потоков, разумнее было бы перенести цикл внутрь потоков.
Спасибо) Попробовал сделать все то же самое, но через CreateEvent, теперь работает)

Цикл внутрь потоков перенести, наверное, не получится... Если рамки задачи немного расширить, то там нужно, чтобы данные выводились еще и на экран, причем после каждой итерации обновлялись. Поэтому в винмейне пришлось сделать такой цикл, а после WaitForMultipleObjects юзать UpdateWindow...
LockHeart вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация потоков добрый_фей Помощь студентам 5 09.12.2011 19:57
Синхронизация потоков alenka_ej Помощь студентам 0 03.06.2010 22:20
Синхронизация потоков в С++ erazer89 Помощь студентам 0 27.04.2010 20:14
синхронизация потоков m_kostik Win Api 0 26.03.2010 23:56