คำถามติดแท็ก multithreading

มัลติเธรดคือความสามารถของคอมพิวเตอร์หรือโปรแกรมในการทำงานพร้อมกันหรือแบบอะซิงโครนัสโดยใช้การประมวลผลหลายกระแสพร้อมกัน (โดยทั่วไปเรียกว่าเธรด)

7
มันฉลาดที่จะแทนที่บูสต์ :: thread และ boost :: mutex ด้วย c ++ 11 เทียบเท่าหรือไม่?
แรงจูงใจ: เหตุผลที่ฉันคิดว่าผู้จัดการโครงการอัจฉริยะของฉันคิดว่าการเพิ่มเป็นอีกการพึ่งพาและมันน่ากลัวเพราะ "คุณขึ้นอยู่กับมัน" (ฉันพยายามอธิบายคุณภาพของการส่งเสริมแล้วเลิกหลังจากนั้นสักครู่ :( ) เหตุผลที่เล็กกว่าที่ฉันต้องการทำคือฉันต้องการเรียนรู้คุณสมบัติ c ++ 11 เพราะผู้คนจะเริ่มเขียนโค้ดลงไปดังนั้น: มีการแมป 1: 1 ระหว่าง#include<thread> #include<mutex>และเพิ่มการเทียบเท่าหรือไม่ คุณจะพิจารณาความคิดที่ดีที่จะเปลี่ยนสิ่งที่เพิ่มด้วย C ++ 11 สิ่ง การใช้งานของฉันเป็นพื้นฐาน แต่มีตัวอย่างเมื่อ std ไม่เสนอเพิ่มอะไรบ้าง หรือ (ดูหมิ่น) ในทางกลับกัน? PS ฉันใช้ GCC ดังนั้นส่วนหัวจึงอยู่ที่นั่น

6
เกิดอะไรขึ้นกับเธรดที่แยกออกเมื่อ main () ออกมา
สมมติว่าฉันเริ่มต้นstd::threadและจากนั้นdetach()เธรดจึงยังคงดำเนินการต่อแม้ว่าสิ่งstd::threadนั้นจะเป็นตัวแทนของมันก็ตาม สมมติเพิ่มเติมว่าโปรแกรมไม่มีโพรโทคอลที่เชื่อถือได้สำหรับการเข้าร่วมเธรดที่ดึงออก1ดังนั้นเธรดที่แยกออกมายังคงทำงานเมื่อmain()ออกจาก ฉันไม่พบสิ่งใดในมาตรฐาน (แม่นยำกว่าในร่าง N3797 C ++ 14) ซึ่งอธิบายสิ่งที่ควรเกิดขึ้นทั้ง 1.10 และ 30.3 ไม่มีถ้อยคำที่เกี่ยวข้อง 1อีกคำถามที่อาจเทียบเท่ากันคือ: "สามารถรวมเธรดที่แยกออกมาได้อีกครั้ง" เนื่องจากโปรโตคอลใดก็ตามที่คุณคิดค้นเพื่อเข้าร่วมส่วนการส่งสัญญาณจะต้องทำในขณะที่เธรดยังทำงานอยู่และตัวกำหนดตารางเวลาระบบปฏิบัติการอาจ ตัดสินใจที่จะทำให้เธรดเข้าสู่โหมดสลีปเป็นเวลาหนึ่งชั่วโมงหลังจากดำเนินการส่งสัญญาณโดยไม่มีวิธีสำหรับการสิ้นสุดการรับเพื่อตรวจสอบความน่าเชื่อถือของเธรดที่เสร็จสิ้น ถ้าวิ่งออกมาจากmain()กับหัวข้อแฝดทำงานเป็นพฤติกรรมที่ไม่ได้กำหนดไว้แล้วใด ๆ ที่ใช้std::thread::detach()เป็นพฤติกรรมที่ไม่ได้กำหนดเว้นแต่หัวข้อหลักไม่เคยออกจาก2 ดังนั้นการรันmain()เธรดที่แยกออกมาจะต้องมีเอฟเฟกต์ที่กำหนดไว้ คำถามคือ: ที่ไหน (ในมาตรฐาน C ++ , ไม่ใช่ POSIX, ไม่ใช่ OS เอกสาร, ... ) เป็นเอฟเฟกต์เหล่านั้นที่กำหนดไว้ 2ไม่สามารถเข้าร่วมเธรดเดี่ยวได้ (ในแง่ของstd::thread::join()) คุณสามารถรอผลจากหัวข้อแฝด (เช่นผ่านทางในอนาคตจากstd::packaged_taskหรือโดยสัญญาณการนับหรือธงและตัวแปรสภาพ) แต่ที่ไม่ได้รับประกันว่าด้ายได้เสร็จสิ้นการดำเนินการ อันที่จริงถ้าคุณใส่ส่วนการส่งสัญญาณเข้าไปในเตาเผาของวัตถุอัตโนมัติครั้งแรกของด้ายที่มีจะโดยทั่วไปจะเป็นรหัส (destructors) ที่ระยะหลังรหัสการส่งสัญญาณ หากระบบปฏิบัติการจัดตารางเวลาเธรดหลักเพื่อใช้ผลลัพธ์และออกก่อนที่เธรดที่แยกออกจะเสร็จสิ้นการรัน destructors ที่กล่าวไว้สิ่งใดที่ ^ Wis จะนิยามไว้จะเกิดอะไรขึ้น

13
num ++ สามารถเป็นอะตอมสำหรับ 'int num' ได้หรือไม่
โดยทั่วไปสำหรับint num, num++(หรือ++num), ในฐานะการดำเนินการอ่าน - แก้ไข - การเขียนไม่ได้เป็นอะตอมมิก แต่ฉันมักจะเห็นคอมไพเลอร์เช่นGCCสร้างรหัสต่อไปนี้ ( ลองที่นี่ ): ตั้งแต่บรรทัดที่ 5 ซึ่งสอดคล้องกับnum++คำสั่งเดียวเราสามารถสรุปได้ว่าnum++ เป็นอะตอมในกรณีนี้หรือไม่? และถ้าเป็นเช่นนั้นหมายความว่าสิ่งที่สร้างขึ้นnum++สามารถนำมาใช้ในสถานการณ์พร้อมกัน (มัลติเธรด) โดยไม่มีอันตรายจากการแข่งขันของข้อมูล (เช่นเราไม่จำเป็นต้องทำตัวอย่างเช่นstd::atomic<int>และกำหนดค่าใช้จ่ายที่เกี่ยวข้องเนื่องจากเป็น ปรมาณูอยู่แล้ว)? UPDATE โปรดสังเกตว่าคำถามนี้ไม่ใช่ว่าการเพิ่มขึ้นเป็นอะตอมหรือไม่ (ไม่ใช่และนั่นคือและเป็นบรรทัดเปิดของคำถาม) มันอาจเป็นได้ในบางสถานการณ์หรือไม่เช่นในกรณีที่ใช้คำสั่งเดียวสามารถใช้เพื่อหลีกเลี่ยงค่าใช้จ่ายของlockคำนำหน้า และในฐานะที่เป็นคำตอบที่ได้รับการยอมรับกล่าวถึงในส่วนที่เกี่ยวกับเครื่องประมวลผลเดียวเช่นเดียวกับคำตอบนี้การสนทนาในความคิดเห็นและอื่น ๆ อธิบายว่ามันสามารถ (แม้ว่าจะไม่ใช่กับ C หรือ C ++)

9
แนวทางปฏิบัติที่ดี: AsyncTask ในระหว่างการเปลี่ยนการวางแนว
AsyncTask เป็นสิ่งที่ดีในการทำงานที่ซับซ้อนในหัวข้ออื่น แต่เมื่อมีการเปลี่ยนแปลงการวางแนวหรือเปลี่ยนแปลงการกำหนดค่าอื่นในขณะที่AsyncTaskยังคงทำงานอยู่ในปัจจุบันActivityจะถูกทำลายและเริ่ม และเมื่ออินสแตนซ์ของAsyncTaskเชื่อมต่อกับกิจกรรมนั้นจะล้มเหลวและทำให้หน้าต่างข้อความ "บังคับปิด" ดังนั้นฉันกำลังมองหา "แนวปฏิบัติที่ดีที่สุด" เพื่อหลีกเลี่ยงข้อผิดพลาดและป้องกันไม่ให้ AsyncTask ล้มเหลว สิ่งที่ฉันเคยเห็นคือ: ปิดใช้งานการเปลี่ยนแปลงการวางแนว (ไม่แน่ใจว่าคุณควรจัดการกับสิ่งนี้อย่างไร) ปล่อยให้งานอยู่รอดและอัปเดตด้วยอินสแตนซ์กิจกรรมใหม่ผ่านทาง onRetainNonConfigurationInstance เพียงแค่ยกเลิกงานเมื่อActivityมีการทำลายและเริ่มต้นใหม่เมื่อActivityมีการสร้างอีกครั้ง ผูกงานกับคลาสแอ็พพลิเคชันแทนอินสแตนซ์กิจกรรม วิธีการบางอย่างที่ใช้ในโครงการ "ชั้นวาง" (ผ่าน onRestoreInstanceState) ตัวอย่างโค้ดบางส่วน: Android AsyncTasks ระหว่างการหมุนหน้าจอ, ส่วนที่ฉันและส่วนที่สอง ShelvesActivity.java คุณช่วยฉันหาวิธีที่ดีที่สุดที่แก้ปัญหาได้ดีที่สุดและใช้งานได้ง่ายเช่นกัน? รหัสตัวเองก็มีความสำคัญเนื่องจากฉันไม่รู้วิธีการแก้ไขอย่างถูกต้อง

5
HashSet พร้อมกันใน. NET Framework
ฉันมีคลาสต่อไปนี้ class Test{ public HashSet<string> Data = new HashSet<string>(); } ฉันต้องการเปลี่ยนฟิลด์ "ข้อมูล" จากเธรดที่แตกต่างกันดังนั้นฉันต้องการความคิดเห็นบางส่วนเกี่ยวกับการใช้งานเธรดที่ปลอดภัยในปัจจุบัน class Test{ public HashSet<string> Data = new HashSet<string>(); public void Add(string Val){ lock(Data) Data.Add(Val); } public void Remove(string Val){ lock(Data) Data.Remove(Val); } } มีวิธีแก้ปัญหาที่ดีกว่าไปยังฟิลด์โดยตรงและป้องกันไม่ให้เข้าถึงหลายเธรดพร้อมกันหรือไม่

2
ฉันจะรับ backtrace สำหรับเธรดทั้งหมดใน GDB ได้อย่างไร
มีคำสั่งที่เทียบเท่าใน GDB กับของ WinDbg's "! process 0 7" หรือไม่? ฉันต้องการแยกเธรดทั้งหมดในไฟล์ดัมพ์พร้อมกับ backtraces ใน GDB "เธรดข้อมูล" จะไม่แสดงผลการติดตามสแต็ก ดังนั้นมีคำสั่งที่ทำหรือไม่

6
ควรใช้ enumerateObjectsUsingBlock กับเมื่อใด
นอกจากความแตกต่างที่ชัดเจน: ใช้enumerateObjectsUsingBlockเมื่อคุณต้องการทั้งดัชนีและวัตถุ อย่าใช้enumerateObjectsUsingBlockเมื่อคุณต้องการแก้ไขตัวแปรท้องถิ่น (ฉันผิดเกี่ยวกับเรื่องนี้ดูคำตอบของ bbum) มีการenumerateObjectsUsingBlockพิจารณาโดยทั่วไปดีขึ้นหรือแย่ลงเมื่อfor (id obj in myArray)ยังจะทำงานหรือไม่ อะไรคือข้อดี / ข้อเสีย (เช่นมันเป็นนักแสดงมากหรือน้อย)?

5
การล็อก mutex ที่ปลดล็อกมีประสิทธิภาพเพียงใด Mutex มีราคาเท่าใด
ในภาษาระดับต่ำ (C, C ++ หรืออะไรก็ตาม): ฉันมีตัวเลือกระหว่างการมี mutexes หลายอัน (เช่น pthread ให้ฉันหรืออะไรก็ตามที่ไลบรารี่ของระบบดั้งเดิมจัดหาให้) หรืออันเดียวสำหรับวัตถุ มันมีประสิทธิภาพแค่ไหนในการล็อค mutex? คือมีกี่คำสั่งแอสเซมเบลอร์และโอกาสที่จะใช้เวลาเท่าไหร่ (ในกรณีที่มีการปลดล็อค mutex) Mutex มีค่าใช้จ่ายเท่าไหร่ เป็นปัญหาหรือไม่ที่จะมีmutex จำนวนมากจริงๆ หรือฉันสามารถโยนตัวแปร mutex ให้มากที่สุดเท่าที่ฉันมีได้ในintตัวแปรและมันก็ไม่สำคัญอะไร (ฉันไม่แน่ใจว่าความแตกต่างระหว่างฮาร์ดแวร์ต่างกันมากแค่ไหนถ้ามีฉันอยากรู้เกี่ยวกับมันด้วย แต่ส่วนใหญ่ฉันสนใจฮาร์ดแวร์ทั่วไป) ประเด็นก็คือโดยการใช้ mutex หลายตัวซึ่งแต่ละส่วนครอบคลุมเพียงส่วนหนึ่งของวัตถุแทนที่จะเป็น mutex เดียวสำหรับวัตถุทั้งหมดฉันสามารถป้องกันได้หลายบล็อก และฉันสงสัยว่าฉันควรจะไปไกลแค่ไหนกับเรื่องนี้ คือฉันควรพยายามที่จะป้องกันบล็อคที่เป็นไปได้จริง ๆ เท่าที่จะเป็นไปได้ไม่ว่าจะซับซ้อนกว่านี้มากเท่าใด การโพสต์บล็อกของ WebKits (2016) เกี่ยวกับการล็อคนั้นเกี่ยวข้องกับคำถามนี้มากและอธิบายความแตกต่างระหว่าง spinlock, ล็อคปรับตัว, futex และอื่น ๆ

5
C # Thread ปลอดภัยอย่างรวดเร็ว (EST) เคาน์เตอร์
วิธีการขอรับตัวนับเธรดที่ปลอดภัยใน C # ด้วยประสิทธิภาพที่ดีที่สุดที่เป็นไปได้คืออะไร สิ่งนี้ง่ายพอ ๆ กับที่ได้รับ: public static long GetNextValue() { long result; lock (LOCK) { result = COUNTER++; } return result; } แต่มีทางเลือกอื่นเร็วขึ้นหรือไม่

6
อะไรคือความแตกต่างระหว่างโมดูลเธรดและโมดูลหลายกระบวนการ?
ฉันกำลังเรียนรู้วิธีใช้threadingและmultiprocessingโมดูลใน Python เพื่อรันการดำเนินการบางอย่างพร้อมกันและเร่งความเร็วโค้ด ฉันพบว่าสิ่งนี้ยาก (อาจเป็นเพราะฉันไม่มีพื้นฐานทางทฤษฎีเกี่ยวกับเรื่องนี้) ที่จะเข้าใจว่าความแตกต่างระหว่างthreading.Thread()วัตถุกับวัตถุนั้นคือmultiprocessing.Process()อะไร นอกจากนี้ฉันยังไม่ชัดเจนว่าจะสร้างอินสแตนซ์คิวงานได้อย่างไรและมีเพียง 4 (เช่น) ที่ทำงานแบบขนานในขณะที่อีกคนรอให้ทรัพยากรว่างก่อนที่จะดำเนินการ ฉันพบว่าตัวอย่างในเอกสารประกอบชัดเจน แต่ไม่ละเอียดถี่ถ้วนมากนัก ทันทีที่ฉันพยายามทำให้ซับซ้อนขึ้นเล็กน้อยฉันก็ได้รับข้อผิดพลาดแปลก ๆ มากมาย (เช่นวิธีการที่ไม่สามารถดองได้เป็นต้น) ดังนั้นฉันควรใช้โมดูลthreadingและเมื่อmultiprocessingใด คุณสามารถเชื่อมโยงฉันกับแหล่งข้อมูลบางส่วนที่อธิบายแนวคิดเบื้องหลังโมดูลทั้งสองนี้และวิธีใช้อย่างเหมาะสมสำหรับงานที่ซับซ้อนได้หรือไม่

5
วิธีคงที่ไม่ซิงโครไนซ์เธรดปลอดภัยหรือไม่ถ้าพวกเขาไม่แก้ไขตัวแปรคลาสคงที่
ฉันสงสัยว่าคุณมีวิธีการคงที่ที่ไม่ได้ทำข้อมูลให้ตรงกัน แต่ไม่ได้แก้ไขตัวแปรคงที่ใด ๆ มันเป็นเธรดที่ปลอดภัยหรือไม่ จะเกิดอะไรขึ้นถ้าเมธอดสร้างตัวแปรโลคอลภายในมัน? ตัวอย่างเช่นรหัสต่อไปนี้ปลอดภัยไหม? public static String[] makeStringArray( String a, String b ){ return new String[]{ a, b }; } ดังนั้นถ้าฉันมีสองเธรดเรียกวิธีการอย่างต่อเนื่องและพร้อมกันหนึ่งกับสุนัข (พูดว่า "Great dane" และ "bull dog") และอื่น ๆ ที่มีแมว (พูดว่า "เปอร์เซีย" และ "สยาม") ฉันจะเคยได้รับแมวและสุนัข อยู่ในอาร์เรย์เดียวกันหรือไม่ หรือแมวและสุนัขจะไม่อยู่ในกระบวนการเดียวกันในเวลาเดียวกันหรือไม่?

6
การใช้งานเธรดรูปแบบซิงเกิลของ Meyers ปลอดภัยหรือไม่
การใช้งานต่อไปนี้โดยใช้การเริ่มต้นขี้เกียจของSingletonเธรด (Meyers 'Singleton) ปลอดภัยหรือไม่ static Singleton& instance() { static Singleton s; return s; } ถ้าไม่ทำไมและวิธีที่จะทำให้มันปลอดภัยไหม?

11
รอรายการอนาคต
ฉันมีวิธีที่คืนค่าListอนาคต List<Future<O>> futures = getFutures(); ตอนนี้ฉันต้องการรอจนกว่าฟิวเจอร์สทั้งหมดจะเสร็จสิ้นการประมวลผลสำเร็จหรืองานใด ๆ ที่มีการส่งคืนถูกส่งกลับโดยโยนในอนาคตข้อยกเว้น แม้ว่างานหนึ่งจะมีข้อยกเว้น แต่ก็ไม่มีประเด็นที่จะรออนาคตอื่น ๆ วิธีการที่เรียบง่ายจะเป็นไปได้ wait() { For(Future f : futures) { try { f.get(); } catch(Exception e) { //TODO catch specific exception // this future threw exception , means somone could not do its task return; } } } แต่ปัญหาคือถ้ายกตัวอย่างเช่นอนาคตที่ 4 จะมีข้อยกเว้นจากนั้นฉันจะรอโดยไม่จำเป็นสำหรับฟิวเจอร์ส …

26
พยายามอ่านหรือเขียนหน่วยความจำที่ได้รับการป้องกัน นี่เป็นข้อบ่งชี้ว่าหน่วยความจำอื่นเสียหาย
ฉันหวังว่าบางคนสามารถให้ความรู้แก่ฉันเกี่ยวกับสิ่งที่อาจทำให้เกิดข้อผิดพลาดนี้: พยายามอ่านหรือเขียนหน่วยความจำที่ได้รับการป้องกัน นี่เป็นข้อบ่งชี้ว่าหน่วยความจำอื่นเสียหาย ฉันไม่สามารถโพสต์รหัสได้เพราะข้อผิดพลาดนี้ดูเหมือนจะถูกโยนทิ้งในพื้นที่สุ่ม ๆ ของแอปพลิเคชัน แอปพลิเคชันจะทำงานที่ใดก็ได้จาก 12-48 ชั่วโมงก่อนที่จะเกิดข้อผิดพลาด บางครั้งมันจะหยุดในจุดสุ่มที่ดูเหมือนและโยนข้อผิดพลาดด้านบนครั้งอื่น ๆ ที่แอปพลิเคชันทั้งหมดหยุดและฉันได้รับหน้าจอที่มีข้อผิดพลาดที่บอกบางอย่างตามแนวของ "มีข้อผิดพลาดร้ายแรงใน ... บั๊กใน CLR หรือ ... "บางอย่างเกี่ยวกับ PInvoke หรือข้อมูลอื่น ๆ ที่ไม่เกี่ยวข้อง เมื่อสิ่งนี้เกิดขึ้นเธรดทั้งหมดจะถูกยกเลิกและไม่มีข้อมูลการดีบัก สรุปนี่คือสิ่งที่แอปพลิเคชันทำ: มันเป็นแอพพลิเคชันเซิร์ฟเวอร์แบบมัลติเธรดที่เขียนด้วยภาษา C # ทั้งหมด ลูกค้าเชื่อมต่อกับเซิร์ฟเวอร์ผ่านซ็อกเก็ต เซิร์ฟเวอร์จะใช้ "สภาพแวดล้อม" เสมือนจริงสำหรับลูกค้าที่พวกเขาสามารถโต้ตอบกันและสิ่งแวดล้อม ใช้หน่วยความจำไม่มาก แต่ฉันไม่เห็นว่ามันรั่ว โดยทั่วไปแล้วจะใช้ประมาณ 1.5GB ฉันไม่คิดว่ามันจะรั่วเพราะการใช้หน่วยความจำค่อนข้างคงที่ตลอดเวลาที่แอปพลิเคชันทำงานอยู่ มันใช้รหัสอย่างต่อเนื่องเพื่อรักษาสภาพแวดล้อมแม้ว่าลูกค้าจะไม่ทำอะไรเลย มันไม่ใช้ซอฟต์แวร์บุคคลที่สามหรือ API อื่น ๆ ทรัพยากรภายนอกเท่านั้นที่แอปพลิเคชันนี้ใช้คือการเชื่อมต่อซ็อกเก็ตและการเชื่อมต่อฐานข้อมูล SQL มันทำงานบนเซิร์ฟเวอร์ 64 บิต ฉันได้ลองแก้ไขข้อบกพร่องนี้ใน VS2008 …

17
ฉันจะตรวจสอบจำนวนเธรดของกระบวนการบน linux ได้อย่างไร
ฉันต้องการตรวจสอบจำนวนเธรดที่ใช้โดยกระบวนการเฉพาะบน Linux มีวิธีง่ายๆในการรับข้อมูลนี้โดยไม่ส่งผลกระทบต่อประสิทธิภาพของกระบวนการหรือไม่?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.