通知前已完成手动解锁

时间:2019-07-11 18:49:05

标签: c++ multithreading

多亏了Scott Meyers医生的书,第263页,我最近发现了<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <div class="grid-container" id="gridid1556351f5ece4ee3a7dce6962be48e39" > <i class="material-icons" style="font-size:48px;">notifications</i> <i class="material-icons" style="font-size:48px;">delete</i> </div>,所以我不得不对其进行搜索on cppreference来进行更多的研究。

https://en.cppreference.com/w/cpp/thread/condition_variable

我对此有几个疑问,因为我已经思考了好几天,但我仍然不明白。

我的问题与这段代码有关:

function unix_to_local($timestamp, $timezone){
    // Create datetime object with desired timezone
    $local_timezone = new DateTimeZone($timezone);
    $date_time = new DateTime('now', $local_timezone);
    $offset = $date_time->format('P'); // + 05:00

    // Convert offset to number of hours
    $offset = explode(':', $offset);
    if($offset[1] == 00){ $offset2 = ''; }
    if($offset[1] == 30){ $offset2 = .5; }
    if($offset[1] == 45){ $offset2 = .75; }
    $hours = $offset[0].$offset2 + 0;

    // Convert hours to seconds
    $seconds = $hours * 3600;

    // Add/Subtract number of seconds from given unix/gmt/utc timestamp
    $result = floor( $timestamp + $seconds );

    return $result;
}

1)我不理解cppreference的作者通过该注释和“等待线程,只能再次阻止”的含义,因为我什至都不知道如何翻译它,并且

2)它确切地表示哪个线程,特别是为什么。

3)它表示thread_worker还是主线程(父线程)?

4)他们选择这样做吗?

如果作者先通知然后手动解锁,它会发生什么变化?

1 个答案:

答案 0 :(得分:4)

这是次要的,通常是不相关的优化。引起关注的原因是,调用notifynotify_all之后唤醒的每个线程都必须在互斥锁被允许继续之前锁定互斥锁。如果对unlock(或notify_one)的调用之后发生了对notify的调用,则唤醒的线程将不得不等到调用线程将其解锁之后再进行调用。如果对unlock的调用是在通知调用之前进行的,则一个唤醒的线程可以立即获取互斥体。