Я не уверен, будет ли std::thread
работать под Cygwin. Единственные должности, которые я нахожу, - это годы и имеют дело с ошибками компилятора. Так что эта проблема немного другая.Неожиданные результаты с std :: thread под Cygwin
Я переношу приложение из Linux в Cygwin. Он использует несколько потоков с std::thread
и работает, за исключением одного: в одном месте звонок std::thread::detach()
сбрасывает Invalid argument
, хотя std::thread::joinable()
возвращает true
.
Я попытался построен пример:
#include<thread>
#include<iostream>
#include<mutex>
#include<condition_variable>
std::thread* t;
std::mutex m;
std::condition_variable cv;
void func(void)
try
{
std::cout << "func" << std::endl;
if (t->joinable())
{
std::cout << "t is joinable" << std::endl;
t->detach();
delete t;
std::unique_lock<std::mutex> lck(m);
cv.notify_all();
}
}
catch(std::exception& e)
{
std::cout << "exception in func: " << e.what() << std::endl;
}
int main(void)
{
try
{
std::unique_lock<std::mutex> lck(m);
t=new std::thread(&func);
cv.wait(lck);
std::cout << "func finished" << std::endl;
cv.wait(lck);
}
catch(std::exception& e)
{
std::cout << "exception in main: " << e.what() << std::endl;
}
return(0);
}
компилировать это на Linux с
g++ -std=c++0x -pthread example.cc
с использованием GCC версии 4.6.3
. Он производит
func
t is joinable
func finished
затем вешает на неопределенное время каждый раз, который, как ожидается, поведение в связи со вторым, непревзойденная вызова cv.wait()
.
На Cygwin компилировать с
g++ -std=c++11 -pthread example.cc
с использованием GCC версии 4.9.3
.
Это иногда показывает описанное выше поведение, иногда это просто показывает
func
затем выходит с 0.
Так что я не могу воспроизвести свою первоначальную ошибку, а получить более странное поведение.
Ваш второй вызов 'cv.wait()' скорее всего, будет заблокирован навсегда - вам больше нечего будет уведомлять 'cv'. –
Не просто вероятно ... это было бы ожидаемым поведением. Я добавил второй вызов 'cv.wait()', чтобы подчеркнуть, что Cygwin в некоторых случаях игнорирует 'cv.wait()' alltogether.В Linux он всегда блокируется навсегда, что ожидается, под Cygwin он иногда выходит. – TFM
Ну, ты сказал, что он висит бесконечно, не упоминая, что ты считал это успешным. –