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

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

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4764 | 回復(fù): 14
打印 上一主題 下一主題

幫我看哈這個(gè)在linux下多線程編程-條件變量編程,哪兒出錯(cuò)了! [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-11-13 11:03 |只看該作者 |倒序?yàn)g覽
/* condmutex.c
*
*/  
#include <stdlib.h>   
#include <stdio.h>   
#include <pthread.h>   
#include <errno.h>     

int gnum = 0;                // globle variable
pthread_mutex_t mutex;        
pthread_cond_t  cond;         


void pthread_func_1 (void);     
void pthread_func_2 (void);     
int main (void)     
{     
    pthread_t tid1 = 0;     
    pthread_t tid2 = 0;     
    int ret = 0;     
      
    pthread_mutex_init (&mutex, NULL);   
    pthread_cond_init(&cond,NULL);  
    ret = pthread_create (&tid1, NULL, (void *)pthread_func_1, NULL);  
    if (ret != 0) {     
        perror ("pthread_1_create";     
    }     
      
    ret = pthread_create (&tid2, NULL, (void *)pthread_func_2, NULL);
    if (ret != 0) {     
        perror ("pthread_2_create";     
    }
    sleep(1);     
    pthread_join (tid1, NULL);     
    pthread_join (tid2, NULL);     
      
    printf ("main programme exit!/n";   
    return 0;     
}   

void pthread_func_1 (void)     
{     
    int i = 0;     
      
    for (i; i<10; i++)     
    {     
        printf ("This is pthread1!/n";      
        pthread_mutex_lock(&mutex);             // acquire mutex lock
     
        while (gnum <= 3) {  
            pthread_cond_wait(&cond, &mutex);  
        }

        gnum = 0;   // gnum++;  // critical resource.  
        printf ("Thread1 add one to num:%d/n", gnum);  
        pthread_mutex_unlock(&mutex);     // release mutex lock
        sleep (1);  
    }     
    pthread_exit(0);
}     
void pthread_func_2 (void)     
{     
    int i = 0;     
      
    for (i; i<15; i++)     
    {     
        printf ("This is pthread2!/n";   
        pthread_mutex_lock(&mutex);         // acquire nutex lock.
        gnum++;  
        printf ("Thread2 add one to num:%d/n", gnum);  
  
        if(gnum == 4) {   
            pthread_cond_signal(&cond);  
        }
        pthread_mutex_unlock(&mutex);   
        sleep(1);
    }     

    pthread_exit (0);     
}   

程序運(yùn)行起來就沒得結(jié)果的!也不知道多線程的該怎么調(diào)試....謝謝解答

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2011-11-13 16:00 |只看該作者
線程1獲得互斥量后等待線程2觸發(fā)條件量,線程2等待線程1釋放互斥量,這樣會(huì)死鎖的,樓主還是好好看看互斥量和條件量的使用吧

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2011-11-15 16:18 |只看該作者
樓主這程序有什么問題嗎?
程序工作得很好,沒問題.
唯一的問題就是,沒有打印出結(jié)果來,可這也是由于樓主將 "\n"  寫成了 "/n"導(dǎo)致的,改過來就好了.

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2011-11-15 16:31 |只看該作者
本帖最后由 crazyhadoop 于 2011-11-17 13:14 編輯

對(duì)于多線程的調(diào)試,其實(shí)也很簡單的:
用GDB進(jìn)行多線程調(diào)試

a.新線程創(chuàng)建、退出以及線程切換信息提示:這些信息的具體顯示依賴于具體的操作系統(tǒng),但所表達(dá)的含義是相同,在SUSE Linux上其信息如同下面所示:

(1) 新線程創(chuàng)建:[New Thread -1209853024 (LWP 32705)]

(2) 線程退出:[Thread -1209853024 (LWP 32705) exited]

(3) 發(fā)生運(yùn)行線程切換:[Switching to Thread -1209853024 (LWP 32705)]


b.線程信息的查看:i/info threads

gdb會(huì)顯示當(dāng)前調(diào)試程序中所有線程信息并標(biāo)識(shí)出當(dāng)前線程,每個(gè)線程信息的格式如下:


•<線程號(hào)> <線程信息>
<位置信息>


(1)

•: *用于標(biāo)識(shí)gdb當(dāng)前的線程上下文,其是唯一的

(2) <線程號(hào)>: 由gdb分配的線程唯一標(biāo)識(shí),而非操作系統(tǒng)線程標(biāo)識(shí),用于gdb相關(guān)命令中標(biāo)識(shí)線程

(3) <線程信息>: 依賴于具體的操作系統(tǒng),在SUSE Linux下,信息如同:“Thread -1209853024 (LWP 32705)”

(4) <位置信息>: 對(duì)于包含調(diào)試信息的代碼,其包含了當(dāng)前所在源文件、代碼行和函數(shù)信息;而對(duì)于沒有調(diào)試信息的代碼,其包含了指令地址、可執(zhí)行文件等信息

c.當(dāng)前線程的切換

在調(diào)試多線程程序時(shí),我們經(jīng)常需要來回查看多個(gè)線程的堆棧信息,這時(shí)可用命令:"thread <線程號(hào)>"將指定的線程設(shè)定為當(dāng)前線程。<線程號(hào)>是gdb所分配線程標(biāo)識(shí),

可用“info threads”查看


d.設(shè)置某個(gè)線程的斷點(diǎn)

在前面所講到關(guān)于“斷點(diǎn)設(shè)置”的命令都是針對(duì)系統(tǒng)中所有的線程,gdb允許只對(duì)指定的線程設(shè)置斷點(diǎn),命令格式如下:

break <location> thread <線程號(hào)> [if ...]


該命令實(shí)際上是在普通斷點(diǎn)設(shè)置之后,追加對(duì)于線程的限制。如果包含了斷點(diǎn)條件設(shè)置,則條件設(shè)置應(yīng)放在線程限制信息之后


e.線程調(diào)度鎖

在調(diào)試多線程程序時(shí),有時(shí)不希望gdb因?yàn)槠渌程遇到某個(gè)斷點(diǎn)或接受到某個(gè)信號(hào),而打斷了當(dāng)前線程的調(diào)試;或根本就不期望其它線程運(yùn)行。

這時(shí)可打開線程調(diào)度鎖,從而禁止線程切換的發(fā)生。缺省情況下,gdb調(diào)試程序時(shí)是關(guān)閉線程調(diào)度鎖的。

(1) set scheduler-locking on/off: 打開/關(guān)閉線程調(diào)度鎖

(2) show scheduler-locking: 查看當(dāng)前線程調(diào)度鎖的設(shè)置狀態(tài)

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2011-11-17 20:52 |只看該作者
pthread_t tid1 = 0;     
pthread_t tid2 = 0;
這倆句可能在不同的系統(tǒng)下會(huì)出錯(cuò),應(yīng)為線程號(hào)不像進(jìn)程號(hào)那樣只是非負(fù)整數(shù),在可移植性操作系統(tǒng)中他們不能當(dāng)整數(shù)處理,這樣才有了pthread_equal存在的必要。

有產(chǎn)生死鎖的可能,加入線程1先執(zhí)行,條件量不成立,阻塞;線程2接著執(zhí)行,對(duì)同一把鎖進(jìn)行枷鎖,就會(huì)產(chǎn)生死鎖

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2011-11-18 17:22 |只看該作者
這個(gè),你確定會(huì)產(chǎn)生死鎖嗎?
這里是條件變量呢,線程1阻塞在條件變量上,自動(dòng)解鎖,線程2就可執(zhí)行了,哪來的死鎖?

論壇徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
7 [報(bào)告]
發(fā)表于 2011-11-19 22:15 |只看該作者
本帖最后由 linuxfellow 于 2011-11-19 22:37 編輯
對(duì)于多線程的調(diào)試,其實(shí)也很簡單的:
用GDB進(jìn)行多線程調(diào)試

a.新線程創(chuàng)建、退出以及線程切換信息提示:這些 ...
qqrilxk 發(fā)表于 2011-11-15 16:31



    我最近正為交互式GDB調(diào)試頭痛,請(qǐng)大家?guī)臀铱纯础?br /> 就以一樓的程序?yàn)槔,在GDB下, 設(shè)置兩個(gè)斷點(diǎn):
(GDB) b main
(GDB) b pthread_create
(GDB) run
程序停在main
(GDB) continue
程序停在pthread_create
(GDB) s
(GDB) next
(GDB) finish
這些命令有時(shí)行, 有時(shí)不行;運(yùn)氣好時(shí),我能跳到pthread_create的下一行,查看產(chǎn)生的線程,并轉(zhuǎn)到線程
很多時(shí)候, s/next/finish后GDB就掛在那里了
不知有什么辦法讓我能可靠地next到下一句語句? 多謝!

論壇徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
8 [報(bào)告]
發(fā)表于 2011-11-19 22:29 |只看該作者
對(duì)于多線程的調(diào)試,其實(shí)也很簡單的:
用GDB進(jìn)行多線程調(diào)試

a.新線程創(chuàng)建、退出以及線程切換信息提示:這些 ...
qqrilxk 發(fā)表于 2011-11-15 16:31


我也在做交互式多線程的GDB調(diào)試,我碰到下面的問題:
以一樓的程序?yàn)槔?br /> 在pthread_create設(shè)置斷點(diǎn),程序會(huì)停在那里:
(GDB)b pthread_create
但下一步無論是單步step還是跳過去都不行。不穩(wěn)定,時(shí)可時(shí)不可。很多時(shí)候GDB掛到那里。 如果跳過去了,GDB就可以轉(zhuǎn)到線程
可能是產(chǎn)生的線程影響了GDBSERVER.我一下子新建6個(gè)線程。有時(shí)么辦法能讓GDB可靠地跳過pthread_create? 多謝!

論壇徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
9 [報(bào)告]
發(fā)表于 2011-11-19 22:35 |只看該作者
不好意思,發(fā)了兩次:第一次送帖后server告訴我:你的回復(fù)來路不明,不能上貼。server刷新也慢,沒看到我的帖子。只好很郁悶地又敲了一次。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2011-11-21 10:05 |只看該作者
你把代碼和調(diào)試時(shí)的現(xiàn)象,問題具體一點(diǎn)貼出來吧,沒太明白你的問題.你具體想干什么呢,想單步進(jìn)入線程中或跳過線程體的調(diào)試?
您需要登錄后才可以回帖 登錄 | 注冊(cè)

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP