#include static gmutex *mutex = null;makefile檔案如下:static gboolean t1_end = false;
static gboolean t2_end = false;
typedef struct _arg arg;
struct _arg
;void run_1(arg *arg)
else
}t1_end = true;
}void run_2(arg *arg)
else
}t2_end = true;
}void run_3(arg *arg) }}
int main(int argc, char *argv)
cc = gccall:
$(cc) `pkg-config --cflags --libs glib-2.0 gthread-2.0` loop.c -o loop
下面為輸出結果:
0 :執行緒1鎖定了互斥物件
1 :執行緒2鎖定了互斥物件
2 :執行緒1鎖定了互斥物件
3 :執行緒2鎖定了互斥物件
4 :執行緒1鎖定了互斥物件
5 :執行緒2鎖定了互斥物件
6 :執行緒1鎖定了互斥物件
7 :執行緒2鎖定了互斥物件
8 :執行緒1鎖定了互斥物件
9 :執行緒2鎖定了互斥物件
10 :執行緒1鎖定了互斥物件
執行緒3退出事件迴圈
釋放互斥物件
釋放引數所用的記憶體
以上例程建立了三個執行緒,其中run_1和run_2操作互斥物件,run_3檢索前兩個執行緒是否結束,如結束的話,則執行g_main_loop_quit退出事件迴圈。由於執行緒的執行是不確定的,所以不一定每次都是這一輸出結果。
首先定義乙個結構型別來儲存建立的事件迴圈的物件指標和執行緒執行時的最多迴圈次數,一般情況下,如果為此資料結構來分配記憶體的話,用arg *arg =(arg*)malloc(sizeof(arg));,釋放時用free(arg);,這種傳統的做法曾經讓很多c語言的初學者頭痛,尤其是需要多次操作的時候,glib中提供了類似的函式g_malloc和g_free,最好用的方法是其將g_malloc函式封裝成了巨集g_new,這個巨集有兩個引數,第乙個是結構型別,第二個是要分配結構的數量,這段**中只用到了乙個arg資料結構,所以是g_new(arg,1)。在程式結束時用g_free來釋放。
glib中hash表函式的使用 ghash
在使用ghash看其文件時對insert的介紹是如果key值相同的value再插入時會被替換,對於判斷key值相等的標準不太清楚,是hash值相等的話發生hash碰撞時不就麻煩了,於是結合文件以及其源 自己寫 做了下驗證,結果如下文描述。1.建立新hash表 ghashtable g hash ta...
關於C 中的GUI執行緒
大家知道,c 中線程分兩種,一種是工作者執行緒,另外一種就是gui執行緒,至於他們這間的區別大家可以上網上查詢 這裡我只是說明一下,建立gui執行緒時,需要注意的地方。有些和視窗相關的執行緒,最好是放在gui執行緒裡,因為和視窗或是特殊控制項有關的初使化操作,gui執行緒已經幫你合理的優化了,如果用...
ATL中關於執行緒安全的優化
一直覺得自己的寫的乙個對臨近區呼叫的乙個封裝類很無敵,簡簡單單就搞定了乙個物件內部的執行緒同步,如果 有全域性變數的話,搞定多個物件的執行緒同步也不是很難,現在看了下atl的原始碼,原來和人家畢竟低等的 封裝一模一樣,慚愧啊。先看看人家對section的封裝吧,class ccomcriticals...