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

  免費(fèi)注冊 查看新帖 |

Chinaunix

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

[C] 問一個(gè)linux多線程的問題 [復(fù)制鏈接]

論壇徽章:
2
申猴
日期:2014-04-17 14:37:17CU十四周年紀(jì)念徽章
日期:2018-06-23 16:03:03
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2014-05-29 23:56 |只看該作者 |倒序?yàn)g覽
  1. #include<pthread.h>
  2. #include<unistd.h>
  3. #include<stdio.h>
  4. #include<string.h>
  5. #include<stdlib.h>
  6. #include<time.h>
  7. static pthread_mutex_t mtx=PTHREAD_MUTEX_INITIALIZER;
  8. static pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

  9. int global_val = 0;

  10. void* test(void *argv) {
  11.     printf("test before lock\n");
  12.     pthread_mutex_lock(&mtx);
  13.     while(global_val == 0) {
  14.         pthread_cond_wait(&cond,&mtx);
  15.     }
  16.     pthread_mutex_unlock(&mtx);
  17.     printf("@@@@@%d\n",global_val);
  18. }
  19. void* add(void *argv) {
  20.     sleep(1);
  21.     printf("add before lock\n");
  22.     pthread_mutex_lock(&mtx);
  23.     global_val++;
  24.     printf("###%d\n",global_val);
  25.     pthread_mutex_unlock(&mtx);
  26.    
  27. }
  28. int main() {
  29.     pthread_t tid1,tid2;
  30.     global_val = 0;
  31.     pthread_create(&tid1,NULL,test,NULL);
  32.     sleep(1);
  33.     pthread_create(&tid2,NULL,add,NULL);
  34.     printf("main begin\n");
  35.     pthread_mutex_lock(&mtx);
  36.     global_val = 5;
  37.     sleep(3);
  38.     pthread_cond_signal(&cond);
  39.     printf("signal over before unlock\n");
  40.     sleep(3);
  41.     pthread_mutex_unlock(&mtx);
  42.     pthread_join(tid1,NULL);
  43.     pthread_join(tid2,NULL);
  44. }
復(fù)制代碼
我要模擬的情況是有一個(gè)test線程阻塞在pthread_cond_wait(&cond,&mtx);,另外一個(gè)add線程阻塞在pthread_mutex_lock(&mtx);
然后主線程調(diào)用pthread_cond_signal(&cond);和pthread_mutex_unlock(&mtx); 這個(gè)時(shí)候會是哪個(gè)線程搶到鎖?
pthread_cond_wait的線程會高優(yōu)先級搶到鎖嗎,還是說隨機(jī)的?
我上面測試代碼是add線程搶到了鎖。
我的測試代碼輸出:
test before lock
main begin
add before lock
signal over before unlock
###6
@@@@@6

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2014-06-04 10:41 |只看該作者
按照入列順序激活,你的例子中test的lock mutex的操作發(fā)生在pthread_cond_signal之后,而add的lock mutex的操作發(fā)生在一開始,因此add線程先入列,因此先unlock add線程的鎖。
你可以做一下測試,將add線程的sleep(1) 改為sleep(5), 讓主線程先pthread_cond_signal,然后add線程lock mutex, 這樣就是test 的 lock mutex 操作先入列,add的后入列,最后再在主線程unlock mutex, 打印順序肯定是test線程搶到了鎖,其實(shí)也不能說是搶對吧,先來先得

論壇徽章:
2
申猴
日期:2014-04-17 14:37:17CU十四周年紀(jì)念徽章
日期:2018-06-23 16:03:03
3 [報(bào)告]
發(fā)表于 2014-06-04 11:08 |只看該作者
嗯,測試你的說的那種情況確定是這樣的。但是現(xiàn)在我把第42行的sleep(3)注釋掉,其他的保存不變。這個(gè)時(shí)候就是test線程先搶到鎖。這個(gè)和你說的矛盾。回復(fù) 2# skycs13


   

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2014-06-04 14:00 |只看該作者
在你把42行的sleep(3)去掉的時(shí)候,在pthread_cond_signal的時(shí)候,立馬就把鎖給釋放了,這個(gè)時(shí)候,主線程先signal條件變量,然后釋放鎖,瞬間就把test的條件變量激活,而在這個(gè)時(shí)候,add線程還在sleep(5)里面,要等個(gè)2(5-3)秒鐘才從sleep(5)中出來,在你去掉sleep(3)之后,根本談不到對鎖的競爭了。這個(gè)時(shí)候就是個(gè)順序的過程。

論壇徽章:
2
申猴
日期:2014-04-17 14:37:17CU十四周年紀(jì)念徽章
日期:2018-06-23 16:03:03
5 [報(bào)告]
發(fā)表于 2014-06-04 15:46 |只看該作者
額,我的意思是add里面sleep的時(shí)間改回去變成1回復(fù) 4# skycs13


   

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2014-06-04 16:01 |只看該作者
我所測試的結(jié)果跟你的不同,我用的是gcc 4.8.2, 我的是add先搶到鎖。你想一下,pthread_cond_signal是在3秒之后才掉用,而add只sleep了一秒就調(diào)用了,按理來說,對于應(yīng)該是add這個(gè)線程先入列而test后入列,也應(yīng)該是先激活add線程,我的結(jié)果global_val打印出來都是6回復(fù) 5# tklist


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

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP