Поток Visual c с неблокирующим мьютексом

#c #multithreading #visual-studio-2005 #waitforsingleobject

#c #многопоточность #visual-studio-2005 #waitforsingleobject

Вопрос:

Я разрабатываю с VC2005, и у меня возникла проблема с потоком.

У меня есть поток, который извлекает данные из очереди и отправляет их. Но этот поток отправляет одно прошение и должен ждать ответа, чтобы отправить новое прошение (я хочу установить тайм-аут, чтобы предотвратить бесконечный тайм-аут).

У меня есть поток, подобный этому:

 while (true){
    dequeue()
    send()
    WaitForSingleObject(ptClass->getMutex(),10000);
}
  

Но этот WaitForSingleObject никогда не останавливается… Я инициализирую событие, подобное этому:

     HANDLE ghMutex = CreateEvent(NULL,FALSE, FALSE, "");
  

Идея состоит в том, чтобы заблокировать поток, чтобы прекратить отправку данных, а когда придет ответ, разблокировать этот поток, чтобы отправить новое прошение… Почему никогда не останавливается???

с уважением

Комментарии:

1. Это не мьютекс. Это событие. Я думаю, вам нужно показать больше кода.

2. Вероятно, он останавливается, но только на 10 секунд. Затем он отправит следующий пакет, поскольку вы указали тайм-аут.

Ответ №1:

Этот имеющийся у вас поток ожидает, когда для события будет установлено значение signaled, чтобы его можно было снова запустить. Вы должны установить для события значение signaled с помощью SetEvent. Не уверен, где бы вы это сделали, поскольку я не знаю вашей архитектуры, но именно этого не хватает.

WaitForSingleObject выводит ваш поток из контекста процессора, но он больше не запускается.

Ваш тайм-аут ожидания должен быть установлен на БЕСКОНЕЧНЫЙ, если вы хотите, чтобы он ждал, пока событие не будет сигнализировано, и вы не можете гарантировать, что это произойдет немедленно.

Вы используете не мьютекс, вы используете AutoResetEvent, но вы должны его установить!

Комментарии:

1. он скорее спрашивает, почему он никогда не блокируется, вместо того, почему он блокируется на неопределенный срок, если я правильно понял.