2011-06-09 14 views
6

के साथ लटक रहा है मैं प्रत्येक एक्स एमएस पर निष्पादित करने के लिए थ्रेड लूप पर pthread_cond_timedwait का उपयोग कर रहा हूं (जब तक यह पहले waked नहीं है)।pdread_cond_timedwait gdb

जब मैं इसे डीबग करने के लिए जीडीबी का उपयोग कर रहा हूं तो कभी-कभी यह फ़ंक्शन कभी वापस नहीं आता है।

This forum post भी एक ही समस्या है, लेकिन कोई समाधान नहीं है।

यहाँ कुछ कोड है कि समस्या reproduces है:

#include <errno.h> 
#include <pthread.h> 
#include <stdio.h> 
#include <unistd.h> 

static pthread_cond_t s_cond = PTHREAD_COND_INITIALIZER; 
static pthread_mutex_t s_mutex = PTHREAD_MUTEX_INITIALIZER; 

int main(int argc, char **argv) 
{ 
    int rc = 0; 
    struct timespec curts = { 0 }; /* transformed timeout value */ 

    clock_gettime(CLOCK_REALTIME, &curts); 
    curts.tv_sec += 10; /* Add 10 seconds to current time*/ 

    pthread_mutex_lock(&s_mutex); 

    printf("pthread_cond_timedwait\n"); 
    rc = pthread_cond_timedwait(&s_cond, &s_mutex, &curts); 
    if (rc == ETIMEDOUT) 
    { 
     printf("Timer expired \n"); 
    } 

    pthread_mutex_unlock(&s_mutex); 

    return 1; 
} 

अगर मैं इसे चलाने, यह ठीक चलेगा, और यह भी ठीक चलेगा अगर मैं gdb में चलाते हैं।

मैंने ये चरण तक ही सीमित है (मैं इस कार्यक्रम timedTest नाम दिया है):

  1. भागो कार्यक्रम;

  2. हालांकि यह इसे संलग्न करता है gdb;

  3. जीडीबी पर continue निष्पादित करें;

  4. timedTest प्रोग्राम कभी वापस नहीं आता ...;

तो फिर, अगर मैं टर्मिनल चल gdb पर Ctrl+C मारा और continue फिर से चलाने के लिए, तो कार्यक्रम वापस आ जाएगी।

मैं शायद इस मामले में जो चाहता हूं उसे प्राप्त करने के लिए मैं कुछ अन्य विधि का उपयोग कर सकता हूं, लेकिन मुझे लगता है कि यह इस समस्या का समाधान होना चाहिए।

संपादित करें: की तरह यह केवल कुछ मशीनों में होता है

लग रहा है, तो हो सकता है वहाँ जीसीसी के साथ/glibc/gdb/कर्नेल संस्करणों कुछ करने के लिए है ...

संस्करण जहां इस लगभग हमेशा होता है:

$ ldd --version 
ldd (Ubuntu EGLIBC 2.13-0ubuntu13) 2.13 

$ gcc --version 
gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 

$ gdb --version 
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2 

$ uname -a 
Linux geovani 2.6.38-8-generic-pae #42-Ubuntu SMP Mon Apr 11 05:17:09 UTC 2011 i686 i686 i386 GNU/Linux 
+0

क्या 'थ्रेड थ्रेड' स्टक थ्रेड पर कुछ भी दिलचस्प दिखाता है? –

+0

यह कितनी बार होता है? मैं इसे पुन: पेश करने की कोशिश कर रहा हूं, लेकिन अब तक यह 10 प्रयासों में नहीं हुआ है। – Ringding

+0

यह लगभग हमेशा होता है, लेकिन शायद यह gdb या glibc या यहां तक ​​कि linux कर्नेल के कुछ संस्करणों के साथ कुछ करने के लिए है ... (पोस्ट में जोड़े गए संस्करण) – Vargas

उत्तर

4

this forum post के अनुसार, इस 2.6.38 कर्नेल में एक बग है। मैंने 2.6.3 9 कर्नेल के साथ कुछ परीक्षण किए हैं और समस्या नहीं होती है। 2.6.38 पर वापस रोलिंग यह फिर से दिखाई देता है।

+1

धन्यवाद! मैं इसे समझने की कोशिश कर पागल हो रहा था – Frederik

 संबंधित मुद्दे