日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

java 条件变量_Windows下条件变量的实现

發布時間:2024/10/14 windows 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 条件变量_Windows下条件变量的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

條件變量是什么?

是一種同步對象。

條件變量有什么用?

用于復雜的、多線程的、多核的程序中,實現多個線程間同步任務。

條件變量與其它同步對象的區別?

與事件、互斥鎖、segment等同步對象相比,條件變量最大的不同在于”條件“二字,其它同步對象的同步”條件“是固定的,如事件的被激發,互斥鎖被釋放,而條件變量的"條件"是完全自定義的,比如你可以實現當”張三賺了5塊錢、李四在看電視、奧巴馬訪問馬爾它“時,條件變量完成同步。所以說條件變量可用于復雜的同步任務。

Windows下有沒有條件變量?

簡單的答案是:沒有,Windows API沒有提供條件變量對象,這就是本文會存在的原因和要解決的問題。

復雜點的答案是:

使用Windows Vista之后的版本(Vista之后的版本提供了native的條件變量對象;

從開源庫中抽取;

你可以自已實現;

方案1不現實,因為現階段你的客戶大多數還是使用windows xp/2003以下的版本,而且Vista賣的也并不好;

方案2可以參考ace庫,不過太多條件宏和不相關代碼,難以抽取使用(你不可能為了一個同步變量,而扯進整個龐大的ace庫吧);

方案3難度更大,必須要熟悉多線程編程,還要考慮很多變態的細節;

我就是采用方案3 -- 自已實現的。因為網上沒有現成的,不得已而為之!而你就不必重新造輪子,直接copy下面的代碼到你的項目里就可以直接使用了(只要你的項目是C++的)。

實現代碼如下:

class my_mutex

{

public:

my_mutex (bool be_initial_owner = false)

{

mutex_ = CreateMutexA (NULL, be_initial_owner, NULL);

}

~my_mutex (void)

{

CloseHandle (mutex_);

}

public:

int acquire (void)

{

DWORD ret = WaitForSingleObject (mutex_, INFINITE);

return ret == WAIT_OBJECT_0 ? 0 : -1;

}

int release (void)

{

BOOL bret = ReleaseMutex (mutex_);

return bret ? 0 : -1;

}

HANDLE handle (void)

{

return mutex_;

}

protected:

HANDLE mutex_;

};

class my_semaphore

{

public:

my_semaphore (long init_count, long max_count = (std::numeric_limits::max)())

{

assert (init_count >= 0 && max_count > 0 && init_count <= max_count);

sema_ = CreateSemaphoreA (NULL, init_count, max_count, NULL);

}

~my_semaphore (void)

{

CloseHandle (sema_);

}

public:

int post (long count = 1)

{

BOOL bret = ReleaseSemaphore (sema_, count, NULL);

return bret ? 0 : -1;

}

int wait (long timeout = -1)

{

DWORD ret = WaitForSingleObject (sema_, timeout);

return ret == WAIT_OBJECT_0 ? 0 : -1;

}

HANDLE handle (void)

{

return sema_;

}

protected:

HANDLE sema_;

};

template

class my_condition

{

public:

my_condition (MUTEX &m)

: mutex_ (m), waiters_ (0), sema_ (0)

{}

~my_condition (void)

{}

public:

/// Returns a reference to the underlying mutex_;

MUTEX &mutex (void)

{

return mutex_;

}

/// Signal one waiting thread.

int signal (void)

{

// must hold the external mutex before enter

if ( waiters_ > 0 )

sema_.post ();

return 0;

}

/// Signal *all* waiting threads.

int broadcast (void)

{

// must hold the external mutex before enter

if ( waiters_ > 0 )

sema_.post (waiters_);

return 0;

}

int wait (unsigned long wait_time = -1)

{

// must hold the external mutex before enter

int ret = 0;

waiters_++;

ret = SignalObjectAndWait (mutex_.handle (), sema_.handle (), wait_time, FALSE);

mutex_.acquire ();

waiters_ --;

return ret == WAIT_OBJECT_0 ? 0 : -1;

}

protected:

MUTEX &mutex_;

/// Number of waiting threads.

long waiters_;

/// Queue up threads waiting for the condition to become signaled.

my_semaphore sema_;

};

使用條件變量的示例:

/// 公共部分

// my_mutx m;

// my_condition c (m);

/// 消費者

m.acquire();

while (!condition_is_satisfied())

{

c.wait(300);

}

handle_something();

m.release();

/// 生產者

produce_something();

m.acquire();

c.signal();

m.release();

以上代碼采用模板實現,變件變量類my_condition的模板參數是與條件變量配合使用的互斥量類型,為了方便直接使用,互斥量類型我也一并提供了: my_mutex。

代碼我已在項目中測試使用過,如果發現問題,歡迎各路高手批評指正。

2018.6.11新增:

根據MSDN文檔對SignalObjectAndWait函數的描述,本文描述的代碼存在死鎖的風險:條件滿足的信號通知丟失。解決的方法就是在調用my_condition的wait方法時,一定要加上比較短的超時參數(比如300毫秒或者幾秒,根據實際情況調整),循環檢測以重新發現條件已經滿足了(條件不會丟失,保存在信號量里)。MSDN原文如下:

Note that the "signal" and "wait" are not guaranteed to be performed as an atomic operation. Threads executing on other processors can observe the signaled state of the first object before the thread calling SignalObjectAndWait begins its wait on the second object.

---------------------

作者:leafarmy

來源:CSDN

原文:https://blog.csdn.net/leafarmy/article/details/4039548

版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

總結

以上是生活随笔為你收集整理的java 条件变量_Windows下条件变量的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产一级片麻豆 | 亚洲免费黄色网址 | 欧美 日韩 国产 成人 在线 91 | 亚洲精品美女在线观看 | 午夜激情男女 | 欧美亚洲日本在线 | 在线h网| 91成品视频 | 少妇激情一区二区三区视频 | 国产在线观看xxx | 久草视频在线资源站 | 91深夜福利 | 人人操日日干 | 蜜臀av一区二区三区有限公司 | 合欢视频在线观看 | 国产精品久久久久久久久久直播 | 亚洲中文一区二区 | 日韩首页| 澳门久久久| 在线免费观看国产视频 | 91丨porny丨在线中文 | 三级三级久久三级久久 | 五月天激情啪啪 | 越南性xxxx精品hd | 妖精视频在线观看免费 | 777午夜| 精品黑人一区二区三区观看时间 | 国产深夜福利 | 日本黄网站色大片免费观看 | 亚洲在线视频免费观看 | 午夜操操 | 久久亚洲影院 | 你懂的日韩 | 国产做爰高潮呻吟视频 | 国产性猛交普通话对白 | 日本免费一区二区三区最新 | 日女人免费视频 | 韩漫动漫免费大全在线观看 | 中文字幕av一区二区三区 | 91久久人澡人人添人人爽欧美 | 激情四射综合网 | 一区二区精品免费 | av网站在线观看不卡 | 国产一区二区网站 | www污污 | 国产99免费 | 成人国产一区二区 | 黑人玩弄人妻一区二区三区四 | 一本色道久久88亚洲精品综合 | 黄页网站在线播放 | 老司机成人在线 | 亚洲素人在线 | 成人av播放 | 日韩在线播放一区二区 | 日韩免费在线 | 天天躁日日躁狠狠躁 | 色哟哟国产精品 | 欧美精品一区二区免费 | 老女人人体欣赏a√s | 黄色网在线播放 | 欧美色图网址 | 欧美精品videos另类日本 | 亚洲自拍色图 | 成人综合色站 | 性久久久久久久久久久 | 在线免费观看 | 涩涩涩涩涩涩涩涩涩涩 | 日韩精品一二三四 | 男女啪啪免费 | 韩国视频一区二区三区 | 人人射人人插 | 爱如潮水3免费观看日本高清 | 黄色高清片 | 国内一区二区三区 | 91中文字幕在线视频 | 人妻久久一区二区 | 久久久精品一区二区 | 碰碰97| 中国av免费看 | 西西人体www大胆高清 | 午夜久久久久 | 欧美性做爰毛片 | 国产精品国产a级 | 亚洲天堂av电影 | 成人久久国产 | 精品自拍偷拍 | 精品国自产在线观看 | 黄色一级视频免费看 | 亚洲av色区一区二区三区 | 已满18岁免费观看电视连续剧 | 一起草国产 | 欧美成人h版在线观看 | 国产资源网| 日韩一区二区高清视频 | 少妇流白浆 | 欧美日韩亚洲色图 | 午夜在线免费视频 | 四虎国产在线观看 | 免费网站av |