2010-07-20 18 views
9

मैं एक पर्ल प्रोग्राम लेने और इसे थ्रेड करने की कोशिश कर रहा हूं। समस्या यह है कि मैंने पढ़ा है कि कुछ मॉड्यूल "थ्रेड सुरक्षित" नहीं हैं। मुझे कैसे पता चलेगा कि मॉड्यूल थ्रेड सुरक्षित है या नहीं? मैंने एक सूची के लिए चारों ओर देखा है और एक का पता नहीं लगा सकता है।पर्ल थ्रेड सुरक्षित मॉड्यूल

एक मॉड्यूल (पाठ :: CSV_XS) मैं अक्सर उपयोग का परीक्षण करने के लिए मैं निम्नलिखित कोड बाहर करने की कोशिश की:

 
Hello thread number: 1 
Segmentation fault 

इसका मतलब यह है:

use strict; 
use warnings; 
use threads; 
use threads::shared; 
require Text::CSV_XS; 

my $CSV = Text::CSV_XS->new ({ binary => 1, eol => "\n" }) or die("Cannot use CSV: ".Text::CSV->error_diag()); 
open my $OUTPUT , ">:encoding(utf8)", "test.csv" or die("test.csv: $!"); 

share($CSV); 

my $thr1 = threads->create(\&sayHello('1')); 
my $thr2 = threads->create(\&sayHello('2')); 
my $thr3 = threads->create(\&sayHello('3')); 


sub sayHello 
{ 
my($num) = @_; 

print("Hello thread number: $num\n"); 

my @row = ($num); 
    lock($CSV);{ 
    $CSV->print($OUTPUT, \@row); 
    $OUTPUT->autoflush(1); 
    }#lock 
}#sayHello 

उत्पादन मैं प्राप्त निम्नलिखित है मॉड्यूल थ्रेड सुरक्षित नहीं है, या यह एक और समस्या है?

धन्यवाद

+1

छोटी से छोटी कार्यक्रम आप कर सकते हैं कि विभाजन गलती का कारण बनता है साथ आने के लिए प्रयास करें। – mob

उत्तर

32

सामान्य शब्दों में, कोर और उच्च दृश्यता मॉड्यूल धागा सुरक्षित हैं जब तक कि उनके प्रलेखन अन्यथा कहते हैं।

  1. share($CSV)
    यह साफ करता है $CSV (एक धन्य hashref), just as documented in threads:

    यानी, अपनी पोस्ट में कुछ missteps हैं। आम तौर पर, आप जटिल वस्तुओं को पूर्व प्रारंभ करने के लिए साझा करना चाहते हैं या शायद इस मामले में, शेयर() कुछ गूंगा $lock धागे के बीच परिवर्तनीय साझा करना चाहते हैं।
    चूंकि $CSV अंतर्निहित एक्सएस के लिए स्थिति रखता है, इससे अपरिभाषित व्यवहार हो सकता है।

    लेकिन यह आपका segfault नहीं है।

  2. threads->create(\&sayHello('1'));
    आपने गलती से मुख्य थ्रेड में sayHello(1) लागू और के रूप में एक (फर्जी) threads->create() को एक संदर्भ गुजर अपनी वापसी मान लिए कर रहे हैं दिनचर्या शुरू करते हैं। आप कहते हैं कि करने के लिए होती:

    threads->create(\&sayHello, '1'); 
    

    लेकिन यह अपने segfault नहीं है।

    (संपादित बस स्पष्ट करने के लिए - एक बुरा शुरू दिनचर्या यहाँ किसी भी मामले में एक SEGV जोखिम नहीं है threads::create को किसी अज्ञात सबरूटीन नाम या गैर कोड रेफरी में पारित हो जाता है अगर ठीक से शिकायत आपके मामले में,।। हालांकि, आप बहुत जल्दी segfaulting कर रहे हैं इस त्रुटि से निपटने तक पहुँचने के लिए।)

  3. एन्कोडिंग धागा सुरक्षित नहीं है।
    फिर से as documented in encodings, encoding मॉड्यूल थ्रेड-सुरक्षित नहीं है।

    use threads; 
    open my $OUTPUT , ">:encoding(utf8)", "/dev/null" or die $!; 
    threads->create(sub {})->join; 
    

    पर्ल 5.12.1 है कि साथ धागे-1.77 i686-linux-धागे की बहु पर, अगर आप रुचि रखते हैं: यहाँ छोटी संभव कोड मैं अपने लक्षणों पुन: पेश करने मिल सकता है। "Utf8" जादू ड्रॉप करें, और यह ठीक काम करता है।

    यह आपके segfault

+0

अच्छा जवाब ... – masonk

+0

यह मुझे मेरे segfault के कारण के लिए खोजने के घंटे बचाया। धन्यवाद! –

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