亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2824 | 回復(fù): 5
打印 上一主題 下一主題

[C] 一個定時器問題,求解答 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-12-16 15:47 |只看該作者 |倒序瀏覽
最近在使用pjlib,它的定時器原理是單獨一個線程在輪詢定時器任務(wù)鏈表,發(fā)現(xiàn)有任務(wù)到時間了就會調(diào)用該任務(wù)的回調(diào)函數(shù)。
在調(diào)用回調(diào)函數(shù)之前 ,它會釋放掉定時器相關(guān)的鎖。
如果有一個這樣的情境,我要cancel一個定時器,但是剛好這個定時器到時間了并且進(jìn)入了回調(diào)函數(shù)。主線程調(diào)用了cancel timer,我認(rèn)為定時器被取消了,定時器的相關(guān)事務(wù)理所當(dāng)然不會再執(zhí)行。但是因為這個線程同步問題,使程序出現(xiàn)很多錯誤。
我就有一個疑惑,設(shè)計定時器的人是不是認(rèn)為這種安全性問題就應(yīng)當(dāng)是上層程序員要考慮的?我看了一下java util里定時器的實現(xiàn),也是這樣。
但是作為上層程序員來說這是多么操蛋的事,我取消一個定時器還要考慮這個定時器可能同時會觸發(fā)。

大神們怎么看待這個問題

論壇徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大;照
日期:2013-04-17 11:01:45CU大;照
日期:2013-04-17 11:02:15CU大;照
日期:2013-04-17 11:02:36CU大;照
日期:2013-04-17 11:02:58技術(shù)圖書徽章
日期:2013-12-04 10:48:50酉雞
日期:2014-01-03 10:32:30辰龍
日期:2014-03-06 15:04:07
2 [報告]
發(fā)表于 2013-12-16 17:22 |只看該作者
你可以只設(shè)置一個取消標(biāo)志,讓定時器自己檢查這個標(biāo)志來取消自己——一般來說,這個標(biāo)志會在定時器執(zhí)行核心邏輯前檢查一次;如果執(zhí)行中被設(shè)置了,那么相關(guān)定時器就在下次被調(diào)度時進(jìn)入撤銷邏輯。

論壇徽章:
0
3 [報告]
發(fā)表于 2013-12-16 17:33 |只看該作者
問題就出在這里了,定時器邏輯核心檢查這個標(biāo)志的時候主線程還沒有調(diào)用cancel。檢查完了,釋放鎖,這下子cancel被調(diào)用了,timer線程正在進(jìn)入callback的入口 。回復(fù) 2# shan_ghost


   

論壇徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大;照
日期:2013-04-17 11:02:15CU大;照
日期:2013-04-17 11:02:36CU大;照
日期:2013-04-17 11:02:58技術(shù)圖書徽章
日期:2013-12-04 10:48:50酉雞
日期:2014-01-03 10:32:30辰龍
日期:2014-03-06 15:04:07
4 [報告]
發(fā)表于 2013-12-17 10:28 |只看該作者
本帖最后由 shan_ghost 于 2013-12-17 10:29 編輯
nichelnich 發(fā)表于 2013-12-16 17:33
問題就出在這里了,定時器邏輯核心檢查這個標(biāo)志的時候主線程還沒有調(diào)用cancel。檢查完了,釋放鎖,這下子ca ...


問題沒出在這里。

人家定時器的標(biāo)志是定時器的,你自己的是自己的;煊媚氵想有好下場?

論壇徽章:
8
CU大;照
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大;照
日期:2013-04-17 11:02:15CU大;照
日期:2013-04-17 11:02:36CU大;照
日期:2013-04-17 11:02:58技術(shù)圖書徽章
日期:2013-12-04 10:48:50酉雞
日期:2014-01-03 10:32:30辰龍
日期:2014-03-06 15:04:07
5 [報告]
發(fā)表于 2013-12-17 11:08 |只看該作者
1、不要去搞大而全,也不要預(yù)期別人會給你搞大而全
比如,定時器就是個定時器:人家只管到時間通知你,別的人家可不管,也不應(yīng)該管:一個在你做任何事時都喋喋不休的反復(fù)問“你確定xxx嗎”的保姆是很討厭的。

2、明確語義,不要窺探別人的內(nèi)部實現(xiàn),更不要改變別人內(nèi)部實現(xiàn)的語義
比如,java認(rèn)為你應(yīng)該這樣取消一個定時器線程:
http://stackoverflow.com/questio ... a-running-timertask

注意,這里cancel的語義是:停止執(zhí)行尚未執(zhí)行的任務(wù),但不觸及那些已經(jīng)在執(zhí)行中的任務(wù)——正處于“保護(hù)現(xiàn)場,準(zhǔn)備進(jìn)入run函數(shù)狀態(tài)”的任務(wù)也是正在執(zhí)行的任務(wù)。

至于定時器內(nèi)部的鎖,那是為了保證在多線程訪問timer時,timer內(nèi)部的數(shù)據(jù)結(jié)構(gòu)不被破壞用的。

3、保證定時器線程和主線程之間的執(zhí)行邏輯正確是你的責(zé)任,定時器沒法替你管。
比如,照你的想法,你覺得自己調(diào)用cancel后,定時器是應(yīng)該在cancel里面terminate你尚未執(zhí)行完的任務(wù)呢、還是卡死在調(diào)用點等你的任務(wù)自己退出?萬一你的任務(wù)不會在短時間內(nèi)退出呢?這種實現(xiàn)不是扯淡嗎?誰敢把定時器寫成這樣?

進(jìn)一步說,既然是“線程”,那就說明它和其它線程之間的執(zhí)行次序本身就是不確定的。你必須實現(xiàn)一個同步點才能保證它們按某種次序執(zhí)行。事先預(yù)料到、并正確實現(xiàn)這個同步點是你的責(zé)任,別推給別人。

論壇徽章:
0
6 [報告]
發(fā)表于 2013-12-17 14:07 |只看該作者
回復(fù) 5# shan_ghost
我就是看看更多人的想法,謝謝,這是我第一次上chinaunix。感謝shan_ghost
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP