के साथ लटक रहा है मैं प्रत्येक एक्स एमएस पर निष्पादित करने के लिए थ्रेड लूप पर 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
नाम दिया है):
भागो कार्यक्रम;
हालांकि यह इसे संलग्न करता है gdb;
जीडीबी पर
continue
निष्पादित करें;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
क्या 'थ्रेड थ्रेड' स्टक थ्रेड पर कुछ भी दिलचस्प दिखाता है? –
यह कितनी बार होता है? मैं इसे पुन: पेश करने की कोशिश कर रहा हूं, लेकिन अब तक यह 10 प्रयासों में नहीं हुआ है। – Ringding
यह लगभग हमेशा होता है, लेकिन शायद यह gdb या glibc या यहां तक कि linux कर्नेल के कुछ संस्करणों के साथ कुछ करने के लिए है ... (पोस्ट में जोड़े गए संस्करण) – Vargas