2012-12-27 8 views
12

जब लिखा मौत परीक्षण चलाने गूगल टेस्ट ढांचे निम्न चेतावनी परीक्षण से प्रत्येक के लिए उत्पादन किया जाता है का उपयोग कर:Google टेस्ट को लिनक्स पर धागे की संख्या का पता लगाने के लिए कैसे करें?

[WARNING] .../gtest-death-test.cc:789:: Death tests use fork(), which is unsafe 
particularly in a threaded context. For this test, Google Test couldn't detect 
the number of threads. 

वहाँ गूगल टेस्ट लिनक्स पर धागे की संख्या का पता लगाने के लिए एक तरीका है?

+1

एक सोच सकता है कि गूगल के चतुर लोग अगर यह आसान था कि ऐसा करने के लिए कैसे पता होगा? ;) –

+2

@MatsPetersson: ठीक है, कभी कभी वहाँ भी कई आसान काम करने के लिए कर रहे हैं। – vitaut

उत्तर

11

मैं स्रोत कोड को देखा है और यह पता चला कि धागे की संख्या का पता लगाने के केवल MacOS एक्स और QNX के लिए लागू किया गया है, लेकिन लिनक्स या अन्य प्लेटफार्मों पर नहीं। इसलिए मैं /proc/self/task में प्रविष्टियों की संख्या की गणना के द्वारा अपने आप को याद आ रही कार्यक्षमता लागू।

size_t GetThreadCount() { 
    size_t thread_count = 0; 
    if (DIR *dir = opendir("/proc/self/task")) { 
    while (dirent *entry = readdir(dir)) { 
     if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) 
     ++thread_count; 
    } 
    closedir(dir); 
    } 
    return thread_count; 
} 

25 अगस्त 2015 के रूप में, Google टेस्ट implements GetThreadCount on Linux:: चूंकि यह दूसरों मैं इसे यहाँ पोस्ट कर रहा हूँ के लिए उपयोगी हो सकता है (मैं भी यह Google Test group को भेज दी है)

size_t GetThreadCount() { 
    const string filename = 
     (Message() << "/proc/" << getpid() << "/stat").GetString(); 
    return ReadProcFileField<int>(filename, 19); 
} 
+0

थोड़ा ऑप्टिमाइज़ेशन, चूंकि सभी प्रविष्टियां संख्याएं होंगी, तो आप केवल 'if (entry-> d_name [0]! ='। ') ...' 'कर सकते हैं ...' आपके दो कॉल की बजाय strcmp ... मुझे यकीन है यह वास्तव में कोई फर्क नहीं पड़ता ... –

+1

मैं, अपने समाधान पसंद करते हैं जिस तरह से। –

+0

@ मैट्स पीटरसन: धन्यवाद। आप प्रदर्शन के बारे में सही हैं, लेकिन यह केवल मृत्यु परीक्षणों के लिए है जो वैसे भी धीमा हो जाते हैं। – vitaut

4

हैं

::testing::FLAGS_gtest_death_test_style = "threadsafe"; 

अधिक जानकारी here: यदि आप परीक्षा निष्पादन समय के बारे में ज्यादा परवाह नहीं है, एक सुविधाजनक विकल्प का प्रयोग है।

+1

मुझे परीक्षण निष्पादन समय की परवाह है, लेकिन उत्तर के लिए धन्यवाद। इस विकल्प के बारे में नहीं पता था। – vitaut

+0

इसे कमांड लाइन तर्क के रूप में भी पारित किया जा सकता है: '--gtest_death_test_style = threadsafe' – psur

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