как заставить поток ждать в другом потоке, который вызывается сам по себе - PullRequest
0 голосов
/ 29 ноября 2018

Я довольно новичок в многопоточности и библиотеках потоков C ++ 11.У меня есть один сценарий, и я был бы признателен, если бы вы продвинулись с ним.

У меня есть 2 потока (скажем, «thread1» и «thread2»), так что «thread1» вызывает «thread2», и он должен ждать при некоторых условиях.пока он не будет выполнен "thread2" или пока не истечет определенное время.

Здесь стоит отметить пару вещей.Во-первых, это всегда «thread1», который вызывает и ожидает «thread2» при некотором условии или ограничении по времени.Во-вторых, «thread2» никогда не вызывает «thread1» в любой точке.

Я пробовал решение, подобное приведенному ниже:

bool condition = false;
std::mutex mtx;
std::condition_variable cv;

void thread1()
{
    std::string str = "string";
    std::unique_lock<std::mutex> lck(mtx);
    thread2(str);

    while(!condition)
    {
        cv.wait(lck);   // or let's say 60 seconds elapsed
    }

    std::cout << "condition reached" << std::endl;
}

void thread2(const std::string& str)
{
    calls_some_other_function(str);
    std::unique_lock<std::mutex> lck(mtx);
    condition = true;
    cv.notify_one();
}

Теперь, это правильная реализация?Сомнение, которое у меня возникло с этой реализацией, заключается в том, как обеспечить, чтобы «thread2» всегда возвращался после того, как «thread1» начинает ждать его, иначе он либо будет продолжать ждать вечно, либо выйдет из таймера (скажем, 60 секунд), дажехотя условие удовлетворяет?.

Пожалуйста, помогите здесь.

...