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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2021, 11:27   #1
Audax Spiritus
Пользователь
 
Регистрация: 07.10.2021
Сообщений: 10
По умолчанию Windows API C Mutex

Код:
int main()
{
	setlocale(LC_ALL, "Russian");
	
	Data data;
	string buffer(24, ' ');
	HANDLE W = CreateThread(NULL, 0, Writer, &buffer, NULL, NULL);
	WaitForSingleObject(Mutex, INFINITE);
	HANDLE R = CreateThread(NULL, 0, Reader, &buffer, NULL, NULL);
	HANDLE* h = new HANDLE[2];
	h[0] = W;
	h[1] = R;
	WaitForMultipleObjects(2, h, TRUE, INFINITE);
	Print(buffer);
	return 0;
}

DWORD WINAPI Writer(LPVOID lpParam)
{
	Mutex = OpenMutex(NULL, FALSE, L"b");
	
	string tmp = *(string*)lpParam;

	for (size_t i = 0; i < 7; i++)
	{
		SetSymbol(*(string*)lpParam, GenerateSymbol(), GeneratePosition(23));
		cout << "Write " << i+1 << endl;
		Sleep(1000); // для рандомайзера
	}

	ReleaseMutex(Mutex);
	return 0;
}

DWORD WINAPI Reader(LPVOID lpParam)
{
	WaitForSingleObject(Mutex, INFINITE);
	Mutex = OpenMutex(NULL, FALSE, L"b");

	WaitForSingleObject(Mutex, INFINITE);

	Print(*(string*)lpParam);

	ReleaseMutex(Mutex);
	return 0;
}
В моем понимании это должно отработать сначала Writer потом Reader, но почему-то начинает работать writer потом влезает reader.

Почему так происходит и как это исправить?
PS: Mutex находится в глобальной области видимости
Изображения
Тип файла: png src.png (18.6 Кб, 8 просмотров)
Audax Spiritus вне форума Ответить с цитированием
Старый 11.10.2021, 12:07   #2
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

а CreateMutex где?
ForenLi вне форума Ответить с цитированием
Старый 11.10.2021, 13:26   #3
Audax Spiritus
Пользователь
 
Регистрация: 07.10.2021
Сообщений: 10
По умолчанию

Глобальный
Audax Spiritus вне форума Ответить с цитированием
Старый 11.10.2021, 13:34   #4
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

OpenMutex не нужен, вызываете WaitForSingleObject и если вернет WAIT_OBJECT_0, то работаете.
ForenLi вне форума Ответить с цитированием
Старый 11.10.2021, 13:42   #5
Audax Spiritus
Пользователь
 
Регистрация: 07.10.2021
Сообщений: 10
По умолчанию

А как сообщить мьютексу, что он занят?
Audax Spiritus вне форума Ответить с цитированием
Старый 11.10.2021, 14:19   #6
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

WaitForSingleObject сама сообщит, но вы хотя бы пример в документации посмотрели https://docs.microsoft.com/en-us/win...-mutex-objects
ForenLi вне форума Ответить с цитированием
Старый 11.10.2021, 14:25   #7
Audax Spiritus
Пользователь
 
Регистрация: 07.10.2021
Сообщений: 10
По умолчанию

Получается, он опрашивает его в цикле, а в задании циклов необходимо избегать? Я уже сижу неделю с этими мьтексами

Последний раз редактировалось Audax Spiritus; 11.10.2021 в 14:31.
Audax Spiritus вне форума Ответить с цитированием
Старый 11.10.2021, 14:31   #8
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Ну не используйте циклы, это ж просто пример.
ForenLi вне форума Ответить с цитированием
Старый 11.10.2021, 14:34   #9
Audax Spiritus
Пользователь
 
Регистрация: 07.10.2021
Сообщений: 10
По умолчанию

Можно поставить в main WaitForSingleObject(Mutex,INFINITE)
И после чего вызвать поток

Так может опрос в цикле проводить нужно
Audax Spiritus вне форума Ответить с цитированием
Старый 11.10.2021, 14:40   #10
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Зачем? Вы поток с мейном синхронизируете или просто не понимаете, что это и зачем?
ForenLi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Windows API C Audax Spiritus Помощь студентам 3 07.10.2021 18:29
Windows API и C# relav_ C# (си шарп) 18 22.01.2014 12:18
Windows API Xme1ez Помощь студентам 3 23.11.2012 21:01
Windows 7 API Gerzs Win Api 2 14.12.2009 16:48