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

คำถามที่เกี่ยวข้องหลายเธรดรวมถึงเทคนิคโครงสร้างและปัญหาด้านความปลอดภัย

1
การวาดปฏิสัมพันธ์ด้าย
ฉันต้องการวาดการโต้ตอบของเธรด (ปากกาและดินสอ) ในสัญลักษณ์ UML (- เหมือน) ฉันไม่ได้ยืนยันใน UML สิ่งใดที่ผู้อ่านควรทำ ฉันเริ่มต้นด้วยลำดับไดอะแกรม แต่ฉันไม่รู้สึกว่านี่เป็นวิธีที่ดีที่สุดในการทำเช่นนั้น ตลอดเวลาจะมี "ผู้ริเริ่มการกระทำ" ที่มาจากนอกจอซึ่งจะทำลายแนวคิด SSD ฉันสืบทอดฐานรหัสขนาดกลางที่มีประมาณ 9 - 10 เธรดแต่ละเครื่องที่เป็นเจ้าของเครื่องรัฐและฉันพยายามหาวิธีการใช้งาน ฉันจะเห็นภาพการโต้ตอบของเธรดได้อย่างไร

8
คุณเรียนรู้บทเรียนใดจากโปรเจ็กต์ที่เกือบ / ล้มเหลวจริง ๆ เนื่องจากมัลติเธรดไม่ดี [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา คุณเรียนรู้บทเรียนใดจากโปรเจ็กต์ที่เกือบ / ล้มเหลวจริง ๆ เนื่องจากมัลติเธรดไม่ดี บางครั้งกรอบกำหนดรูปแบบเกลียวบางอย่างที่ทำให้สิ่งที่ลำดับความสำคัญยากที่จะได้รับ สำหรับฉันฉันยังไม่หายจากความล้มเหลวครั้งสุดท้ายและฉันรู้สึกว่ามันดีกว่าที่ฉันจะไม่ทำงานกับสิ่งที่เกี่ยวข้องกับมัลติเธรดในกรอบงานนั้น ฉันพบว่าฉันเก่งในการแก้ปัญหาแบบมัลติเธรดซึ่งมีทางแยกอย่างง่าย / เข้าร่วมและที่ซึ่งข้อมูลเดินทางไปในทิศทางเดียวเท่านั้น (ในขณะที่สัญญาณสามารถเดินทางในทิศทางวงกลม) ฉันไม่สามารถจัดการ GUI ที่งานบางอย่างสามารถทำได้ในเธรดที่มีการจัดลำดับอย่างเคร่งครัดเท่านั้น ("เธรดหลัก") และงานอื่น ๆ สามารถทำได้บนเธรดใดก็ได้ยกเว้นเธรดหลัก ("เธรดผู้ปฏิบัติงาน") และ ที่ข้อมูลและข้อความต้องเดินทางในทุกทิศทางระหว่างองค์ประกอบ N (กราฟที่เชื่อมต่ออย่างสมบูรณ์) ตอนที่ฉันออกจากโครงการนั้นไปอีกโครงการหนึ่งมีปัญหาการหยุดชะงักทุกที่ ฉันได้ยินมาว่า 2-3 เดือนต่อมาผู้พัฒนารายอื่นหลายคนจัดการเพื่อแก้ไขปัญหาการหยุดชะงักทั้งหมดจนถึงจุดที่สามารถส่งมอบให้กับลูกค้าได้ ฉันไม่เคยพบว่าความรู้ที่หายไปนั้นขาดไป บางอย่างเกี่ยวกับโครงการ: จำนวน ID ข้อความ (ค่าจำนวนเต็มซึ่งอธิบายความหมายของเหตุการณ์ที่สามารถส่งไปยังคิวข้อความของวัตถุอื่นโดยไม่คำนึงถึงเธรด) ทำงานเป็นหลายพันรายการ สตริงที่ไม่ซ้ำกัน (ข้อความผู้ใช้) ยังทำงานเกี่ยวกับหนึ่งพัน ที่เพิ่ม การเปรียบเทียบที่ดีที่สุดที่ฉันได้รับจากทีมอื่น (ไม่เกี่ยวข้องกับโครงการในอดีตหรือปัจจุบันของฉัน) คือการ "ใส่ข้อมูลในฐานข้อมูล" ("ฐานข้อมูล" …

2
มีการใช้เธรดจำนวนเท่าใด
เมื่อฉัน (อีกครั้ง) สร้างระบบขนาดใหญ่บนคอมพิวเตอร์เดสก์ท็อป / แล็ปท็อปฉันบอกmakeให้ใช้มากกว่าหนึ่งเธรดเพื่อเร่งความเร็วในการรวบรวมเช่นนี้: $ make -j$[ $K * $C ] ที่$Cควรจะระบุจำนวนแกน (ซึ่งเราสามารถถือว่าเป็นตัวเลขที่มีหนึ่งหลัก) เครื่องมีในขณะที่$Kเป็นสิ่งที่ฉันแตกต่างจาก2ไป4ขึ้นอยู่กับอารมณ์ของฉัน ตัวอย่างเช่นฉันอาจบอกว่าmake -j12ฉันมี 4 แกนระบุว่าmakeจะใช้ถึง 12 กระทู้ เหตุผลของฉันคือถ้าฉันใช้เฉพาะ$Cเธรดแกนจะว่างขณะที่กระบวนการกำลังดึงข้อมูลจากไดรฟ์ แต่ถ้าฉันไม่ จำกัด จำนวนเธรด (เช่นmake -j) ฉันเสี่ยงที่จะเสียเวลาในการสลับบริบท, หน่วยความจำไม่เพียงพอหรือแย่กว่านั้น สมมติว่าเครื่องมี$Mหน่วยความจำกิ๊ก ( $Mอยู่ในอันดับ 10) ดังนั้นฉันสงสัยว่ามีกลยุทธ์ที่จัดตั้งขึ้นเพื่อเลือกจำนวนเธรดที่มีประสิทธิภาพมากที่สุดที่จะเรียกใช้หรือไม่

2
ความปลอดภัยของเธรดสามารถให้บริการได้อย่างไรโดยภาษาการเขียนโปรแกรมคล้ายกับวิธีที่ความปลอดภัยของหน่วยความจำมีให้โดย Java และ C #
Java และ C # ให้ความปลอดภัยของหน่วยความจำโดยการตรวจสอบขอบเขตของอาเรย์และตัวชี้ dereferences กลไกใดที่สามารถนำไปใช้กับภาษาโปรแกรมเพื่อป้องกันความเป็นไปได้ของสภาพการแข่งขันและการหยุดชะงัก

2
เหตุใดโปรแกรมเมอร์กำหนดรูปแบบการเขียนโปรแกรมเพื่อแทนที่ C / POSIX สำหรับการขนาน
ผู้ให้บริการสถาปัตยกรรมคอมพิวเตอร์ใหม่พยายามแนะนำรูปแบบการเขียนโปรแกรมใหม่อย่างสม่ำเสมอเช่นเมื่อเร็ว ๆ นี้ CUDA / OpenCL สำหรับ GPGPU และแทนที่ C / POSIX เป็นอินเทอร์เฟซการควบคุมไปยังแพลตฟอร์มแบบคู่ขนาน (Poss & Koening, AM3: สู่ตัวเร่งความเร็ว Unix สำหรับหลายคอร์, 2015) ทำไมนักออกแบบสถาปัตยกรรมจึงพยายามออกแบบโมเดลการเขียนโปรแกรมใหม่เพื่อแทนที่ C / POSIX สำหรับการคำนวณแบบขนาน C / POSIX ไม่เหมาะกับมัลติโปรเซสเซอร์หรือผู้เขียนต้นฉบับของ C / POSIX ไม่จำเป็นต้องใช้การคำนวณแบบขนานในการออกแบบ C / POSIX หรือไม่? หรือเป็นกรณีที่โปรแกรมเมอร์ต้องการความสามารถมากกว่า C / POSIX ที่สามารถส่งมอบได้ดังนั้นจึงหันไปใช้การออกแบบใหม่เช่น CUDA / OpenCL เป็นต้น

1
Message Queue สำหรับ RTOS สำหรับไมโครคอนโทรลเลอร์
ฉันกำลังเขียน RTOS สำหรับไมโครคอนโทรลเลอร์ สิ่งทั้งหมดเขียนใน C ++ 11 - ถ้าใครสนใจและลิงค์ไปยังที่เก็บอยู่ด้านล่าง ขณะนี้ฉันกำลังเขียนคลาสที่เป็นคิวข้อมูลแบบง่ายสำหรับการส่งวัตถุระหว่างเธรด (หรือระหว่างตัวจัดการอินเตอร์รัปต์และเธรดหรือตัวจัดการอินเตอร์รัปต์และตัวจัดการอินเตอร์รัปต์อื่น) โดยปกติฉันพยายามติดตาม API ทั่วไปที่พบในโครงการอื่น ๆ แต่ฉันไม่พบตัวอย่างของคิวที่เกิดขึ้นพร้อมกันที่มีemplace()ฟังก์ชันและรองรับการหมดเวลา "ปัญหา" ทั่วไปของฉันคือฉันไม่สามารถตัดสินใจระหว่างสองอินเตอร์เฟส: ( std::chrono::duration<Rep, Period>เป็นเทมเพลตฉันละเว้นเทมเพลตสำเร็จรูปเพื่อความชัดเจน) รุ่นแรก: template<typename T> class FifoQueue { public: ... template<typename... Args> int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args); int tryPopFor(T&, std::chrono::duration<Rep, Period>); int tryPushFor(const T&, std::chrono::duration<Rep, Period>); int tryPushFor(T&&, std::chrono::duration<Rep, Period>); ... …

4
ความแตกต่างระหว่างการทำงานของอะตอมและความปลอดภัยของเธรดหรือไม่
จากการสนทนาที่ฉันได้เห็นดูเหมือนว่าการทำงานของปรมาณูและความปลอดภัยของเธรดนั้นเป็นสิ่งเดียวกัน แต่ผู้คนมากมายบอกว่าพวกเขาต่างกัน มีใครบอกความแตกต่างได้ไหมถ้ามี

1
แนวคิดมันหมายความว่าอย่างไรเมื่อมีการกล่าวว่าแต่ละเธรดได้รับสแต็กของตัวเอง?
ฉันได้อ่านJava Concurrency ในทางปฏิบัติโดย Brian Goetz และในส่วนStack Confinementมีการกล่าวถึงว่าแต่ละเธรดได้รับสแต็กของตัวเองและตัวแปรในเครื่องจึง จำกัด อยู่ภายในเธรดที่กำลังดำเนินการ มีอยู่ในเธรดที่กำลังเรียกใช้งานซึ่งไม่สามารถเข้าถึงได้กับเธรดอื่น เขาหมายความว่าอะไรที่แต่ละเธรดมีสแตกการเรียกใช้ของตนเอง

3
กำลังมองหารูปแบบการล็อคแบบกระจาย
ฉันจำเป็นต้องมีกลไกการล็อคออบเจ็กต์ซ้ำแบบกำหนดเอง \ pattern สำหรับระบบแบบกระจายใน C # โดยพื้นฐานแล้วฉันมีระบบหลายโหนด แต่ละโหนดมีสิทธิ์การเขียนพิเศษเหนือชิ้นส่วนของn -number สถานะเดียวกันนี้ยังมีอยู่ในรูปแบบอ่านอย่างเดียวบนโหนดอื่นอย่างน้อยหนึ่งโหนด การเขียน / อัปเดตบางรายการจะต้องเป็นแบบปรมาณูในทุกโหนดในขณะที่การอัปเดตอื่น ๆ ในที่สุดจะกลายเป็นกระบวนการจำลองแบบพื้นหลังที่สอดคล้องกันคิว ฯลฯ ... สำหรับการอัปเดตอะตอมมิกฉันกำลังมองหารูปแบบหรือตัวอย่างที่อนุญาตให้ฉันทำเครื่องหมายวัตถุอย่างถูกล็อกสำหรับการเขียนซึ่งฉันสามารถกระจายกระทำย้อนกลับ ฯลฯ ... เนื่องจากระบบมีการทำงานพร้อมกันในระดับสูงฉัน ฉันคิดว่าฉันจะต้องสามารถล็อคสแต็กอัพซึ่งจะหมดเวลาหรือไม่ได้เปิดเมื่อล็อคถูกปล่อยออกมา ส่วนการทำธุรกรรมหรือการส่งข้อความนั้นไม่ได้เป็นจุดสนใจของคำถามนี้ แต่ฉันได้จัดเตรียมไว้สำหรับบริบทเพิ่มเติมบางอย่าง จากที่กล่าวมาคุณสามารถพูดได้อย่างชัดเจนว่าคุณต้องการข้อความใดหากคุณต้องการ นี่คือตัวอย่างที่คลุมเครือของสิ่งที่ฉันคาดคิดแม้ว่าฉันจะเปิดรับความคิดใหม่ ๆ นอกเหนือจากการใช้ผลิตภัณฑ์ใหม่ทั้งหมด thing.AquireLock(LockLevel.Write); //Do work thing.ReleaseLock(); ฉันคิดว่าจะใช้วิธีการขยายซึ่งอาจมีลักษณะเช่นนี้ public static void AquireLock(this IThing instance, TupleLockLevel lockLevel) { //TODO: Add aquisition wait, retry, recursion count, timeout …

6
หากฉันใช้ตัวล็อคอัลกอริทึมของฉันยังคงสามารถล็อคได้หรือไม่?
คำจำกัดความทั่วไปของการล็อกฟรีคือกระบวนการอย่างน้อยหนึ่งกระบวนการกำลังดำเนินการอยู่ 1 ถ้าฉันมีโครงสร้างข้อมูลอย่างง่ายเช่นคิวที่ได้รับการปกป้องโดยการล็อกดังนั้นหนึ่งกระบวนการสามารถสร้างความคืบหน้าได้เสมอเนื่องจากกระบวนการหนึ่งสามารถรับการล็อกทำสิ่งที่มันต้องการและปล่อยมันได้ ดังนั้นมันตรงตามคำจำกัดความของล็อคฟรีหรือไม่? 1ดูเช่น M. Herlihy, V. Luchangco และ M. Moir การซิงโครไนซ์ที่ไม่มีสิ่งกีดขวาง: ตัวอย่างคิวคู่สิ้นสุด ใน Distributed Computing, 2003. "มันไม่ล็อคถ้ามันทำให้แน่ใจว่าเฉพาะเธรดบางตัวเท่านั้นที่ทำให้เกิดความคืบหน้า"

6
เธรดใช้หน่วยความจำเสมือนหรือหน่วยความจำจริงหรือไม่?
ฉันพยายามเพิ่มประสิทธิภาพเซิร์ฟเวอร์ Linux ของฉันเพื่อจัดการ 10,000 เธรดต่อกระบวนการในขณะที่มันเพิ่ง 382 ในขณะนี้ ตามบทความนี้จะใช้สูตรต่อไปนี้เพื่อค้นหาเธรดที่เป็นไปได้ทั้งหมด: number of threads = total virtual memory / (stack size*1024*1024) ซึ่งหมายความว่าเธรดจะเก็บข้อมูลทั้งหมดไว้ในหน่วยความจำเสมือน และเพื่อความรู้ที่ดีที่สุดของฉันหน่วยความจำเสมือนคือพื้นที่สว็อปในเครื่อง Linux ซึ่งเก็บไว้ในฮาร์ดดิสก์มากกว่า RAM หรือแคช ดังนั้นคำถามของฉันคือเธรดของเราใช้ harddisk เพื่อเก็บประมวลผล / เก็บข้อมูล ถ้าใช่แล้วประสิทธิภาพนี้จะไม่ได้ผลหรือไม่? เราสามารถปรับปรุงประสิทธิภาพโดยการใส่ไว้ใน RAM หรือแคชได้หรือไม่? อย่างไร? ถ้าไม่มีเธรดทำงานอย่างไร ปรับปรุง: ตามคำตอบที่ไร้ประโยชน์หน่วยความจำเสมือนเป็นระบบที่ประกอบด้วย: หน่วยความจำกายภาพ (RAM) swapfiles ใด ๆ ที่คุณแนบ การสนับสนุนฮาร์ดแวร์สำหรับการแปลที่อยู่เสมือนจริงไปยังที่อยู่จริงและการออกหน้าผิดพลาดเมื่อไม่มีที่อยู่เสมือนในหน่วยความจำกายภาพ ซอฟต์แวร์สนับสนุน (เคอร์เนล) สำหรับ: การจัดการตารางการค้นหาที่ใช้โดยฮาร์ดแวร์นั้นที่จัดการข้อบกพร่องของหน้าเหล่านั้นโดยการดึงหน้าเข้าจาก swap ตามต้องการ …

6
เหตุใดเธรดจึงเรียกว่าเธรด
ฉันเข้าใจว่ากระบวนการเป็นหน่วยของการเป็นเจ้าของทรัพยากรและคำแนะนำในการปฏิบัติการ เธรดอนุญาตให้กระบวนการแบ่งปันทรัพยากรด้วยการประมวลผลหลายครั้งและง่ายกว่าสำหรับ OS ที่จะกำหนดเวลาเธรดเนื่องจากโอเวอร์เฮดทั้งหมดที่เกี่ยวข้องกับกระบวนการทั้งหมด แต่ทำไมด้ายชื่อ? มันมีการอ้างอิงถึงสตริงหรือ interleaving ของการดำเนินการบางอย่าง? ถึงอย่างนั้นนี่ไม่ใช่คำศัพท์ที่เข้าใจง่ายในความคิดของฉัน

1
คนงานที่ไม่ปิดกั้น VS หลายคนที่ปิดกั้น
ถือว่ามีเซิร์ฟเวอร์ HTTP ซึ่งยอมรับการเชื่อมต่อแล้วจะได้อย่างใดรอให้ส่วนหัวจะถูกส่งอย่างเต็มที่ใน. ฉันสงสัยว่าเป็นวิธีที่ใช้กันมากที่สุดของการดำเนินการนั้นและสิ่งที่มีข้อดีและข้อเสียที่เหลือ ฉันคิดได้เฉพาะสิ่งเหล่านี้: คนงานที่ขวางกั้นหลายคนเก่งเพราะ: มันตอบสนองมากขึ้น ง่ายต่อการแนะนำการเชื่อมต่อใหม่ (คนงานรับพวกเขาเองมากกว่ารอคนนอกจนกว่าจะสามารถเพิ่มลงในรายการที่ทำข้อมูลให้ตรงกัน) การใช้งาน CPU จะทำยอดคงเหลือโดยอัตโนมัติ (โดยไม่ต้องใช้ความพยายามเพิ่มเติม) เมื่อจำนวนการเชื่อมต่อเพิ่มขึ้นและลดลง การใช้ CPU น้อยลง (เธรดที่ถูกบล็อกถูกนำออกจากลูปการดำเนินการและไม่ต้องการตรรกะใด ๆ สำหรับการกระโดดข้ามไคลเอนต์) ผู้ปฏิบัติงานที่ไม่บล็อกคนเดียวนั้นดีเพราะ: ใช้หน่วยความจำน้อยลง ลูกค้าที่ขี้เกียจน้อยกว่า (ซึ่งเชื่อมต่อกับเซิร์ฟเวอร์และส่งส่วนหัวอย่างช้าๆหรือไม่ส่งเลย) อย่างที่คุณอาจจะเห็นว่าในความคิดของฉันคนงานหลายหัวข้อดูเหมือนโซลูชันที่ดีขึ้นโดยรวม ปัญหาเดียวของมันคือการโจมตีเซิร์ฟเวอร์นั้นง่ายกว่า แก้ไข (การวิจัยเพิ่มเติม): ทรัพยากรบางอย่างที่ฉันพบบนเว็บ ( พันเธรดและการบล็อก I / O - วิธีเก่าในการเขียนเซิร์ฟเวอร์ Java คือใหม่อีกครั้ง (และดีกว่า)โดย Paul Tyma) คำแนะนำที่ว่าวิธีการบล็อกโดยทั่วไปดีกว่า ฉันยังไม่รู้จริงๆว่าจะจัดการกับการเชื่อมต่อปลอมได้อย่างไร PS ไม่แนะนำให้ใช้ไลบรารีหรือแอปพลิเคชันสำหรับงาน ฉันสนใจที่จะรู้ว่ามันใช้งานได้จริงหรืออาจทำงานได้ดีกว่าทำงาน PSS ฉันแบ่งลอจิกออกเป็นหลายส่วนและอันนี้จัดการได้เฉพาะการยอมรับส่วนหัว HTTP ไม่ประมวลผลพวกเขา

3
IPC ไม่ล็อคใน Linux สำหรับโปรเซสเซอร์แบบมัลติคอร์
ฉันกำลังพยายามหาวิธีเขียนแอปพลิเคชันด้วย IPC แบบปลอดล็อคบน Linux ใน C พร้อมตัวประมวลผลแบบมัลติคอร์ สมมติว่าฉันมีกระบวนการ 1 และกระบวนการ 2 ที่เขียนไปยัง FIFO หรือหน่วยความจำที่ใช้ร่วมกัน จากนั้นประมวลผล 3 และกระบวนการ 4 จะอ่านจากหน่วยความจำที่แชร์หรือ FIFO เป็นไปได้ด้วยอัลกอริธึมที่ไม่ล็อคหรือไม่ คำแนะนำของคุณได้รับการชื่นชมอย่างมาก

1
กระทู้: เธรดเคอร์เนลกับเธรดที่สนับสนุนเคอร์เนลเทียบกับเธรดระดับผู้ใช้?
ไม่มีใครรู้ว่าความแตกต่างระหว่างสิ่งเหล่านี้คืออะไร? สำหรับฉันแล้วดูเหมือนว่าเคอร์เนลเธรดจะสอดคล้องกับรหัสที่ใช้เคอร์เนล (อย่างสังหรณ์ใจ) แต่ฉันไม่แน่ใจเกี่ยวกับอีกสอง ... นอกจากนี้มาตรฐาน pthreads จะถูกพิจารณาเป็นระดับผู้ใช้และสนับสนุนเคอร์เนลเนื่องจากคุณกำลังเข้าถึงไลบรารีในขณะที่เคอร์เนลทำการตั้งเวลา / สลับเธรดทั้งหมดหรือไม่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.