2014-02-09 5 views
0

У меня есть минимальный код AI для игры в шашки на C++. При этом основная программа вызывает функцию, которую я написал в новом потоке, пока она спит в течение 5 секунд, после чего он возвращается к основной программеизмеренное истекшее время в многопроцессорной программе C++

int flag = 0 ; 
void execute(){ 
    hThread = (HANDLE) _beginthread(myfunction) ; 
    sleep(5000); 

    if(flag == 1) // Do some work 
} 


Outputval myfunction(...) { 

    clock_t start = clock() ; 
    while(double(clock() - start)/CLOCKS_PER_SEC < 4) { //CLOCKS_PER_SEC = 1000 

     //DO SOME WORK 

    } 
    flag = 1; 
    return somevalue ; 

} 

Моя проблема заключается в том, что, хотя работа в моей функции требуется примерно 3-4 с, но прошедшее время, которое вычисляется после каждой итерации, составляет порядка 0-1 сек. Таким образом, цикл в моей функции продолжает работать, даже если прошло 4 секунды и флаг не установлен Я также использовал функцию time() - она ​​дает такую ​​же проблему.

+0

Выполняет ** void execute ** без() работы? Что такое CLOCKS_PER_SEC, как? Было бы проще использовать time_t, который возвращает время в секундах? – cup

+3

Я не думаю, что ваш дизайн очень хорош. Нет никакой гарантии, что myfunction() завершит свою работу до того, как сон на основной нити закончится. Чего вы все равно пытаетесь достичь? Есть ли настоящая причина для создания нового потока для выполнения работы? Было бы разумно, если бы ваш основной поток был занят чем-то другим, но, поскольку он стоит, он не делает ничего, кроме ожидания. Кроме того, вы должны попробовать использовать семафоры или мьютексы вместо флагов, поскольку они более безопасны, а тайм-аут может быть присущ функциям ожидания. –

+0

Вот почему я использовал цикл. Я должен обеспечить в myfunction(), что он возвращается до того, как спать на основной поток завершается. Выполнение функции выполнения я не могу изменить, поскольку она появилась из какой-либо другой команды и должна использоваться как есть. Единственное, что я могу изменить, это myfunction(). – user3289221

ответ

1

Не ответ, но «осторожность»:

Если предположить, что переменная флаг является глобальным и виден в обоих потоках. Поскольку по крайней мере один доступ не является атомарным (C++ 11) или , флаг не является volatile (C++ 03), ваш код содержит «гонку данных», и это вызовет «неопределенное поведение». Неопределенное поведение открывает широкий спектр возможностей оптимизации для компилятора:

компилятор оптимизирует код следующим образом:

начиная с:

int flag = 0 ; 
void execute{ 
    hThread = (HANDLE) _beginthread(myfunction) ; 
    sleep(5000); 

    if(flag == 1) // Do some work 
} 

это может в конечном итоге создать этот код:

constexpr int flag = 0 ; 
void execute{ 
    hThread = (HANDLE) _beginthread(myfunction) ; 
    sleep(5000); 

    if(0) {}// Never do anything 
} 

У вашего кода есть другие проблемы. Я предлагаю полный редизайн.

Смежные вопросы