@kodwi
https://moikrug.ru/kodwi

POSIX threads + usleep — почему не работает?

Эмулирую работу терминала по продаже билетов, клиенты появляются в рандомное время, спрашивают о наличии билетов в течение рандомного промежутка времени и затем покупают тоже в течение рандомного промежутка времени. Рандом на каждую операцию должен быть разный, т.е. генерирую время в микросекундах, вывожу описание текущей операции и усыпляю поток с помощью usleep на это время. НО поток засыпает на столько, на сколько сам захочет, а не на сгенерированный промежуток времени. Например, сгенерировано 9.3 сек, а просыпается где-то через 3. Что не так?

//	функция, содержащая действия потока-клиента
void *customer_function(void *arg)
{
	//	устанавливаем состояние завершения на немедленное, при получении запроса
	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
	
	int my_id;
	
	unsigned int ssss;
		
	srand(time(NULL));

...	

	printf("\n\nCustomer has joined the queue");

	//	захват мьютекса
	pthread_mutex_lock(&mutex);
	
...

// left и right целые, устанавливаются при запуске из ключей, в секундах, например от left == 2 до right == 5 сек
	ssss = (rand() % ((right - left) * 10 + 1) + left * 10);

	printf("\n\nCustomer #%d is asking about the tickets... Time to sleep = %.1lf secs", my_id, ssss / 10.0);

	//	задержка работы потока на рандомное число секунд от left до right секунд
	usleep(ssss * 100000);
	
	....
	
	ssss = (rand() % ((right - left) * 10 + 1) + left * 10);

	printf("\n\nCustomer #%d is buying the tickets... Time to sleep = %.1lf secs", my_id, ssss / 10.0);
	
	//	задержка работы потока на рандомное число секунд от left до right секунд
	usleep(ssss * 100000);
	
....

	//	после покупки выводим инфо о купленных / заказанных билетах
	printf("\n\nCustomer #%d 's purchase result:\n", my_id);

...
	
	//	освобождение мьютекса
	pthread_mutex_unlock(&mutex);
}
  • Вопрос задан
  • 601 просмотр
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
usleep имеет код возврата и устанавливает errno в случае ошибки. Воспользуйтесь этим.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы