который является правильным способом использования шаблона bool timed_wait (lock_type & lock, boost :: system_time const & abs_time)? - PullRequest
0 голосов
/ 30 января 2020

Я собираюсь использовать timed_wait () из boost для ожидания условной переменной. Я не смог найти хороший код мира из документации Boost и нашел несколько ссылок на переполнение стека. в этих примерах я обнаружил следующие 2 варианта использования.

  1. bool bDoneInTime = g_Condition.timed_wait(lockedCondLock, boost::system_time() + boost::posix_time::seconds(1));, передавая задержку с добавлением ее в системное время.
  2. bool bDoneInTime = g_Condition.timed_wait(lockedCondLock, boost::posix_time::seconds(1)); просто передавайте задержку

Я попробовал оба в следующем примере кода только для тестирования

#include <string>
#include <vector>
#include <iostream>
#include <thread>
#include <time.h>
#include <sys/time.h>
#include <pthread.h>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition_variable.hpp>


static boost::mutex g_ConditionMutex;
typedef boost::unique_lock<boost::mutex> lock_t;
static boost::condition_variable g_Condition;

using namespace std;


void* fun(void* arg)
{
    printf("\nIn thread\n");

    lock_t lock(g_ConditionMutex);
    printf("Sleep second\n");
    g_Condition.timed_wait(lock, boost::posix_time::seconds(1));

    printf("Sleep second as zebra driver\n");
    g_Condition.timed_wait(lock, boost::system_time() + boost::posix_time::seconds(1));

    printf("\nDone\n");
}


int main(int argc, char *argv[])
{
    pthread_t thread;
    void *ret;

    pthread_create(&thread, NULL, fun, NULL);
    printf("Sleep 10 sec main\n");
    sleep(10);
    printf("Notify\n");
    g_Condition.notify_one();

    pthread_join(thread,&ret);
return 0;
}

, оба метода работают, но я не совсем понимаю, как использовать этот template<typename lock_type> bool timed_wait(lock_type& lock,boost::system_time const& abs_time) от boost.

Пожалуйста, кто-нибудь, помогите мне разобраться в правильном пути.

...