亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? qwaitcondition_unix.cpp

?? QT 開發環境里面一個很重要的文件
?? CPP
字號:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the QtCore module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qplatformdefs.h"#include "qwaitcondition.h"#include "qmutex.h"#include "qatomic.h"#include "qmutex_p.h"#include "qstring.h"#include <errno.h>#ifndef QT_NO_THREADstatic void report_error(int code, const char *where, const char *what){    if (code != 0)        qWarning("%s: %s failure: %s", where, what, qPrintable(qt_error_string(code)));}struct QWaitConditionPrivate {    pthread_mutex_t mutex;    pthread_cond_t cond;    int waiters;    int wakeups;};/*!    \class QWaitCondition    \brief The QWaitCondition class provides a condition variable for    synchronizing threads.    \threadsafe    \ingroup thread    \ingroup environment    QWaitCondition allows a thread to tell other threads that some    sort of condition has been met. One or many threads can block    waiting for a QWaitCondition to set a condition with wakeOne() or    wakeAll(). Use wakeOne() to wake one randomly selected condition or    wakeAll() to wake them all.    For example, let's suppose that we have three tasks that should    be performed whenever the user presses a key. Each task could be    split into a thread, each of which would have a    \l{QThread::run()}{run()} body like this:    \code        forever {            mutex.lock();            keyPressed.wait(&mutex);            do_something();            mutex.unlock();        }    \endcode    Here, the \c keyPressed variable is a global variable of type    QWaitCondition.    A fourth thread would read key presses and wake the other three    threads up every time it receives one, like this:    \code        forever {            getchar();            keyPressed.wakeAll();        }    \endcode    The order in which the three threads are woken up is undefined.    Also, if some of the threads are still in \c do_something() when    the key is pressed, they won't be woken up (since they're not    waiting on the condition variable) and so the task will not be    performed for that key press. This issue can be solved using a    counter and a QMutex to guard it. For example, here's the new    code for the worker threads:    \code        forever {            mutex.lock();            keyPressed.wait(&mutex);            ++count;            mutex.unlock();            do_something();            mutex.lock();            --count;            mutex.unlock();        }    \endcode    Here's the code for the fourth thread:    \code        forever {            getchar();            mutex.lock();            // Sleep until there are no busy worker threads            while (count > 0) {                mutex.unlock();                sleep(1);                mutex.lock();            }            mutex.unlock();            keyPressed.wakeAll();        }    \endcode    The mutex is necessary because the results of two threads    attempting to change the value of the same variable    simultaneously are unpredictable.    Wait conditions are a powerful thread synchronization primitive.    The \l{threads/waitconditions}{Wait Conditions} example shows how    to use QWaitCondition as an alternative to QSemaphore for    controlling access to a circular buffer shared by a producer    thread and a consumer thread.    \sa QMutex, QSemaphore, QThread, {Wait Conditions Example}*//*!    Constructs a new wait condition object.*/QWaitCondition::QWaitCondition(){    d = new QWaitConditionPrivate;    report_error(pthread_mutex_init(&d->mutex, NULL), "QWaitCondition", "mutex init");    report_error(pthread_cond_init(&d->cond, NULL), "QWaitCondition", "cv init");    d->waiters = d->wakeups = 0;}/*!    Destroys the wait condition object.*/QWaitCondition::~QWaitCondition(){    report_error(pthread_cond_destroy(&d->cond), "QWaitCondition", "cv destroy");    report_error(pthread_mutex_destroy(&d->mutex), "QWaitCondition", "mutex destroy");    delete d;}/*!    Wakes one thread waiting on the wait condition. The thread that    is woken up depends on the operating system's scheduling    policies, and cannot be controlled or predicted.    If you want to wake up a specific thread, the solution is    typically to use different wait conditions and have different    threads wait on different conditions.    \sa wakeAll()*/void QWaitCondition::wakeOne(){    report_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wakeOne()", "mutex lock");    d->wakeups = qMin(d->wakeups + 1, d->waiters);    report_error(pthread_cond_signal(&d->cond), "QWaitCondition::wakeOne()", "cv signal");    report_error(pthread_mutex_unlock(&d->mutex), "QWaitCondition::wakeOne()", "mutex unlock");}/*!    Wakes all threads waiting on the wait condition. The order in    which the threads are woken up depends on the operating system's    scheduling policies and cannot be controlled or predicted.    \sa wakeOne() */void QWaitCondition::wakeAll(){    report_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wakeAll()", "mutex lock");    d->wakeups = d->waiters;    report_error(pthread_cond_broadcast(&d->cond), "QWaitCondition::wakeAll()", "cv broadcast");    report_error(pthread_mutex_unlock(&d->mutex), "QWaitCondition::wakeAll()", "mutex unlock");}/*!    Releases the locked \a mutex and wait on the wait condition.    The \a mutex must be initially locked by the calling thread. If    \a mutex is not in a locked state, this function returns    immediately. If \a mutex is a recursive mutex, this function    returns immediately. The \a mutex will be unlocked, and the    calling thread will block until either of these conditions is    met:    \list    \o Another thread signals it using wakeOne() or wakeAll(). This       function will return true in this case.    \o \a time milliseconds has elapsed. If \a time is \c ULONG_MAX       (the default), then the wait will never timeout (the event       must be signalled). This function will return false if the       wait timed out.    \endlist    The mutex will be returned to the same locked state. This    function is provided to allow the atomic transition from the    locked state to the wait state.    \sa wakeOne(), wakeAll() */bool QWaitCondition::wait(QMutex *mutex, unsigned long time){    if (! mutex)        return false;    if (mutex->d->recursive) {        qWarning("QWaitCondition: cannot wait on recursive mutexes");        return false;    }    report_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wait()", "mutex lock");    ++d->waiters;    mutex->unlock();    int code;    forever {        if (time != ULONG_MAX) {            struct timeval tv;            gettimeofday(&tv, 0);            timespec ti;            ti.tv_nsec = (tv.tv_usec + (time % 1000) * 1000) * 1000;            ti.tv_sec = tv.tv_sec + (time / 1000) + (ti.tv_nsec / 1000000000);            ti.tv_nsec %= 1000000000;            code = pthread_cond_timedwait(&d->cond, &d->mutex, &ti);        } else {            code = pthread_cond_wait(&d->cond, &d->mutex);        }        if (code == 0 && d->wakeups == 0) {            // many vendors warn of spurios wakeups from            // pthread_cond_wait(), especially after signal delivery,            // even though POSIX doesn't allow for it... sigh            continue;        }        break;    }    Q_ASSERT_X(d->waiters > 0, "QWaitCondition::wait", "internal error (waiters)");    --d->waiters;    if (code == 0) {        Q_ASSERT_X(d->wakeups > 0, "QWaitCondition::wait", "internal error (wakeups)");        --d->wakeups;    }    report_error(pthread_mutex_unlock(&d->mutex), "QWaitCondition::wait()", "mutex unlock");    mutex->lock();    if (code && code != ETIMEDOUT)        report_error(code, "QWaitCondition::wait()", "cv wait");    return (code == 0);}#endif // QT_NO_THREAD

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲色图20p| 在线观看亚洲a| 丝袜美腿亚洲色图| 一区二区日韩av| 亚洲一区欧美一区| 亚洲一区免费视频| 午夜电影一区二区| 人禽交欧美网站| 日韩二区三区四区| 久久er精品视频| 国产在线精品一区二区三区不卡| 日本aⅴ亚洲精品中文乱码| 日韩精品久久久久久| 日韩高清不卡一区二区三区| 裸体在线国模精品偷拍| 久久se精品一区二区| 国产精品18久久久久久久网站| 国产综合一区二区| 成人涩涩免费视频| 在线免费观看日本一区| 5566中文字幕一区二区电影| 日韩三级精品电影久久久| 久久久综合视频| 亚洲精品一二三| 免费观看成人av| 成人高清在线视频| 欧美日韩国产不卡| 久久免费的精品国产v∧| 国产精品久久久久久久岛一牛影视| 中文字幕亚洲精品在线观看| 亚洲国产成人tv| 国产曰批免费观看久久久| 97久久精品人人澡人人爽| 欧美剧情片在线观看| 国产日韩欧美a| 午夜欧美在线一二页| 国产麻豆成人精品| 欧美三级韩国三级日本三斤| 久久综合九色综合97婷婷女人| 1区2区3区精品视频| 蜜桃久久久久久久| 色呦呦日韩精品| 国产欧美一区二区精品秋霞影院| 亚洲国产精品一区二区久久恐怖片| 日韩电影一二三区| 色偷偷久久人人79超碰人人澡| 欧美成人伊人久久综合网| 一区二区成人在线视频| 国产乱码字幕精品高清av| 欧美精品三级在线观看| 国产精品天干天干在线综合| 日本网站在线观看一区二区三区| 99精品欧美一区二区三区小说| 日韩午夜激情视频| 亚洲大型综合色站| 色婷婷亚洲综合| 国产欧美日韩另类一区| 日韩av在线播放中文字幕| 色香色香欲天天天影视综合网| 国产亚洲欧洲997久久综合| 手机精品视频在线观看| 色8久久精品久久久久久蜜| 国产精品国产三级国产普通话蜜臀 | 亚洲高清不卡在线观看| 成人一区二区三区| 久久蜜桃一区二区| 精品一区二区三区视频在线观看| 欧美日本一道本| 洋洋av久久久久久久一区| av网站一区二区三区| 国产精品日产欧美久久久久| 国产成人啪午夜精品网站男同| 欧美大肚乱孕交hd孕妇| 免播放器亚洲一区| 精品sm在线观看| 韩国欧美国产一区| 久久久久久久久久久久久女国产乱| 日本中文字幕一区二区有限公司| 欧美日韩一区二区三区四区| 国产精品三级av| a美女胸又www黄视频久久| 亚洲人成小说网站色在线| www.亚洲色图.com| 一区二区三区在线不卡| 91蜜桃免费观看视频| 亚洲国产精品人人做人人爽| 欧美日高清视频| 经典三级在线一区| 国产午夜精品理论片a级大结局| 国产黄人亚洲片| 日韩美女视频一区二区| 欧美色视频在线观看| 日韩在线a电影| www国产精品av| 不卡免费追剧大全电视剧网站| 国产精品理伦片| 欧美日韩免费观看一区三区| 美日韩一区二区| 国产精品国产三级国产aⅴ无密码| 91免费看`日韩一区二区| 亚洲成国产人片在线观看| 欧美电视剧在线看免费| 国产69精品久久久久777| 亚洲乱码中文字幕| 欧美一区二区精品久久911| 国产麻豆精品theporn| 亚洲欧美电影一区二区| 日韩精品最新网址| av一区二区不卡| 麻豆精品久久久| 最近日韩中文字幕| 日韩欧美亚洲国产另类| aaa欧美大片| 麻豆免费看一区二区三区| 中文字幕av一区二区三区高 | 亚洲国产精品二十页| 欧美三级电影一区| 顶级嫩模精品视频在线看| 偷拍自拍另类欧美| 国产精品色婷婷| 欧美v国产在线一区二区三区| 91色综合久久久久婷婷| 国产精品一二三区在线| 亚洲影视在线播放| 国产精品视频免费看| 日韩午夜电影av| 久久久久久久综合狠狠综合| 欧美性猛片xxxx免费看久爱| 国产91清纯白嫩初高中在线观看 | 亚洲一卡二卡三卡四卡| 久久精品一区二区三区不卡牛牛| 欧美美女喷水视频| 99精品欧美一区二区三区综合在线| 另类的小说在线视频另类成人小视频在线| 综合久久给合久久狠狠狠97色| 日韩午夜激情免费电影| 在线观看91av| 色8久久精品久久久久久蜜| youjizz久久| 国产电影一区在线| 国产超碰在线一区| 国内外成人在线| 麻豆91在线观看| 久久精品国产免费| 免费av成人在线| 奇米影视一区二区三区小说| 亚洲成av人片www| 亚洲一区欧美一区| 亚洲第一狼人社区| 午夜激情综合网| 秋霞成人午夜伦在线观看| 亚洲成人av在线电影| 亚洲韩国精品一区| 天堂成人国产精品一区| 亚洲一区二区在线观看视频| 亚洲日韩欧美一区二区在线| 亚洲日本韩国一区| 亚洲综合激情网| 亚洲大片一区二区三区| 亚洲国产视频一区二区| 亚洲国产美女搞黄色| 免费成人美女在线观看.| 美女视频一区二区| 国产iv一区二区三区| 成人午夜视频在线| 91视频国产资源| 在线观看日韩精品| 欧美一级理论片| 国产性色一区二区| 亚洲三级在线免费观看| 亚洲成人激情综合网| 美国十次综合导航| 成人自拍视频在线| 91免费视频大全| 91精品国产综合久久久久久久久久| 日韩一区二区电影网| 26uuu国产一区二区三区| 国产精品私人影院| 夜夜嗨av一区二区三区网页| 日本麻豆一区二区三区视频| 激情综合网天天干| 91免费视频大全| 日韩欧美你懂的| 综合激情网...| 免费高清成人在线| 99re视频精品| 日韩欧美久久一区| 中文字幕一区二区三区四区| 亚洲va欧美va天堂v国产综合| 韩日av一区二区| 色94色欧美sute亚洲线路二| 精品国产91久久久久久久妲己| 亚洲人精品午夜| 狠狠色综合色综合网络| 99re这里只有精品首页| 日韩午夜在线观看视频| 亚洲激情综合网| 国产中文一区二区三区| 欧洲人成人精品| 国产精品二区一区二区aⅴ污介绍|