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

  免費注冊 查看新帖 |

Chinaunix

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

gtk的GCond如何理解 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2005-12-15 11:49 |只看該作者 |倒序瀏覽
請問下面兩個函數(shù)的意思:
void        g_cond_signal                   (GCond *cond);
void        g_cond_wait                     (GCond *cond,  GMutex *mutex);


下面是Glib Reference Manual里面的一個例子:
  1. GCond* data_cond = NULL;   /* Must be initialized somewhere */
  2. GMutex* data_mutex = NULL; /* Must be initialized somewhere */
  3. gpointer current_data = NULL;

  4. void push_data (gpointer data)
  5. {
  6.   g_mutex_lock (data_mutex);
  7.   current_data = data;
  8.   g_cond_signal (data_cond);
  9.   g_mutex_unlock (data_mutex);
  10. }

  11. gpointer pop_data ()
  12. {
  13.   gpointer data;

  14.   g_mutex_lock (data_mutex);
  15.   while (!current_data)
  16.       g_cond_wait (data_cond, data_mutex);
  17.   data = current_data;
  18.   current_data = NULL;
  19.   g_mutex_unlock (data_mutex);
  20.   return data;
  21. }
復(fù)制代碼


是不是應(yīng)該這樣理解(我英文不行):當我調(diào)用了pop_data()的時候,如果current_data==NULL,那么pop_data()處于wait狀態(tài),直到其它線程調(diào)用了push_data(),這時push_data()會發(fā)送一個signal(g_cond_signal),然后把pop_data()激活。
這里是不是只有push一個元素的時候才能pop一個?如果我連續(xù)push兩個,而在這之間并沒有調(diào)用pop,那么g_cond_signal發(fā)送到Data_cond的信號怎么處理?還有就是這里的Data_mutex是在lock什么東西啊?


我基礎(chǔ)比較差,所以請大家多多指教!

論壇徽章:
0
2 [報告]
發(fā)表于 2005-12-15 14:37 |只看該作者
這兩個函數(shù)用于進行線程同步。

mutex 是“mutual exclusion”(互斥)的英文縮寫,用來保證線程對于共享數(shù)據(jù)的獨占訪問。

當調(diào)用了pop_data()的時候,如果current_data==NULL,那么調(diào)用了pop_data()函數(shù)的線程將處于wait狀態(tài),直到其它線程調(diào)用了push_data()。這時,push_data()會添加新的數(shù)據(jù)并發(fā)送一個signal通知這一情況。原來處于等待狀態(tài)的線程在收到信號后解除 g_cond_wait() 等待狀態(tài),然后執(zhí)行 while 循環(huán);由于此時循環(huán)條件已經(jīng)不成立了(current_data!=NULL說明有了有效數(shù)據(jù)),while 循環(huán)結(jié)束,從而結(jié)束線程的等待狀態(tài),程序會取得新的數(shù)據(jù)供使用。

只要一直有數(shù)據(jù)(current_data!=NULL),在pop_data() 的時候 while 循環(huán)的條件就不成立,從而不會進入等待狀態(tài),可以多次pop_data(),直到數(shù)據(jù)為空為止(current_data==NULL)。當然,如果共享的數(shù)據(jù)只有一個,那就在pop_data()之后只有等到push_data()添加新的數(shù)據(jù)才行了。

如果用g_cond_signal()多次發(fā)送信號而沒有被接收的話,這些信號將被丟棄。

對于多線程編程,先找一些專門介紹的資料來看看還是很有必要的。
您需要登錄后才可以回帖 登錄 | 注冊

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