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

  免費注冊 查看新帖 |

Chinaunix

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

[進程管理] 請教大牛個問題:多線程若線程2正鎖住mutex,此時線程1使用pthread_mutex_try()作用? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-03-27 17:24 |只看該作者 |倒序瀏覽
本帖最后由 251300891 于 2013-03-27 17:31 編輯

請教大牛一個問題:
共享全局變量

static int g_int=0;
static pthread_mutex_t mutex;

線程1:
  1.     int ret = pthread_mutex_trylock(&mutex);                        //try lock
  2.     [size=5][color=Magenta]如何設(shè)置等待mutex時間?[/color][/size]

  3.     if (ret == EBUSY){
  4.                                     printf("pthread2:the variable is locked by pthread1\n");
  5.     被其他線程使用時,緩存動作

  6.     } else if (ret != 0) {
  7.                                     perror("pthread_mutex_trylock");
  8.                                     exit(1);
  9.     } else {
  10.                                     printf("pthread2:pthread2 got lock.\n");
  11.     馬上設(shè)g_int=1;
  12.                                     pthread_mutex_unlock(&mutex);
  13.     }
復(fù)制代碼
復(fù)制代碼
線程2:
  1.     pthread_mutex_lock(&mutex);
  2.     //do something
  3.     //處理時間比較長
  4.     g_int=1;
  5.     pthread_mutex_unlock(&mutex)
復(fù)制代碼
復(fù)制代碼
若線程2正鎖住mutex時,此時線程1使用pthread_mutex_trylock()會立即返回嗎?
可以讓thread_a設(shè)置等待mutex鎖的時間嗎?pthread_cond_timedwait等有設(shè)計過的嗎?

論壇徽章:
0
2 [報告]
發(fā)表于 2013-03-28 10:41 |只看該作者

論壇徽章:
0
3 [報告]
發(fā)表于 2013-03-28 15:04 |只看該作者
本帖最后由 blake326 于 2013-03-28 15:06 編輯

pthread_mutex_lock()系列好像沒有超時等待的吧。不記得了。

線程1要超時的話,一般是pthread_mutex_lock阻塞住,然后搞一個定時器吧。次奧,不記得了什么api了,不過倒是用過alarm信號的,一點也不好用。

論壇徽章:
0
4 [報告]
發(fā)表于 2013-03-28 15:17 |只看該作者
本帖最后由 blake326 于 2013-03-28 15:25 編輯

好像linux 用戶態(tài)真沒有什么現(xiàn)成的timer api呢。怪不得我以前用了alarm。

可以借鑒內(nèi)核設(shè)計,在用戶態(tài)創(chuàng)建一個timer線程專門提供timer功能。

timer線程主要維護一個紅黑樹,管理所有timer,key的話是超時的絕對秒數(shù)。然后一個死循環(huán),通過select睡眠一個最近的超時時間。當select超時返回時,檢測紅黑樹上所有超時的timer,進行回調(diào)處理。如果注冊了一個timer要比當前最近的timer更早的超時的話,則要讓發(fā)一個信號讓select立即返回,檢查是否要處理超時時間,并且更新最新的睡眠時間。

提供timer api貌似也得有一個線程。

論壇徽章:
0
5 [報告]
發(fā)表于 2013-04-18 12:14 |只看該作者
回復(fù) 4# blake326


   

論壇徽章:
0
6 [報告]
發(fā)表于 2013-04-19 22:04 |只看該作者
回復(fù) 4# blake326
內(nèi)核在用戶態(tài)提供了POSIX TIMER API:
基于 2.6 版本內(nèi)核定時器的實現(xiàn) (Posix 實時定時器 )
Linux 自 2.6 開始,已經(jīng)開始支持 POSIX timer [ 2 ]所定義的定時器,它主要由下面的接口構(gòu)成 :

清單 8. POSIX timer 接口
                               
#include <signal.h>
#include <time.h>

int timer_create(clockid_t clockid, struct sigevent *evp,
timer_t *timerid);
int timer_settime(timer_t timerid, int flags,
const struct itimerspec *new_value,
struct itimerspec * old_value);
int timer_gettime(timer_t timerid, struct itimerspec *curr_value);
int timer_getoverrun(timer_t timerid);
int timer_delete(timer_t timerid);

這套接口是為了讓操作系統(tǒng)對實時有更好的支持,在鏈接時需要指定 -lrt 。
timer_create(2): 創(chuàng)建了一個定時器。
timer_settime(2): 啟動或者停止一個定時器。
timer_gettime(2): 返回到下一次到期的剩余時間值和定時器定義的時間間隔。出現(xiàn)該接口的原因是,如果用戶定義了一個 1ms 的定時器,可能當時系統(tǒng)負荷很重,導(dǎo)致該定時器實際山 10ms 后才超時,這種情況下,overrun=9ms 。
timer_getoverrun(2): 返回上次定時器到期時超限值。
timer_delete(2): 停止并刪除一個定時器

詳見https://www.ibm.com/developerworks/cn/linux/l-cn-timers/


   
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(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