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

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

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

2
นักแสดงทำงานอย่างไรเมื่อเทียบกับเธรด
มีคำอธิบายที่ดีและสั้น ๆ เกี่ยวกับการทำงานของนักแสดงเมื่อเทียบกับเธรดหรือไม่? ไม่สามารถมองเห็นเธรดในฐานะนักแสดงและส่งข้อความไปยังเธรดอื่นได้หรือไม่? ฉันเห็นความแตกต่างบางอย่าง แต่ก็ไม่ชัดเจนสำหรับฉัน ฉันสามารถใช้นักแสดงในภาษาใดก็ได้โดยใช้เธรดที่แตกต่างกันหรือไม่

9
Node.js หรือ Erlang
ฉันชอบเครื่องมือเหล่านี้มากเมื่อพูดถึงระดับการทำงานพร้อมกันที่สามารถจัดการได้ Erlang / OTP ดูเหมือนโซลูชันที่มีเสถียรภาพมากกว่า แต่ต้องการการเรียนรู้ที่มากขึ้นและการดำน้ำลึกเข้าไปในกระบวนทัศน์ภาษาที่ใช้งานได้ และดูเหมือนว่า Erlang / OTP จะทำให้ดีขึ้นมากเมื่อพูดถึงซีพียูแบบมัลติคอร์ (แก้ไขฉันถ้าฉันผิด) แต่ควรเลือกแบบไหน? อันไหนดีกว่ากันในมุมมองระยะสั้นและระยะยาว? เป้าหมายของฉันคือการเรียนรู้เครื่องมือที่ทำให้การปรับขนาดโครงการเว็บของฉันภายใต้ภาระงานสูงทำได้ง่ายกว่าภาษาทั่วไป

13
เขียนโปรแกรมที่จะเข้าสู่ภาวะชะงักงัน [ปิด] อย่างแน่นอน
ปิด . คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เน้นไปที่ปัญหาเดียวโดยแก้ไขโพสต์นี้เท่านั้น ปิดให้บริการใน5 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันเพิ่งได้รับคำถามนี้ในการสัมภาษณ์ ฉันตอบว่าการหยุดชะงักเกิดขึ้นหากการสอดประสานผิดพลาด แต่ผู้สัมภาษณ์ยืนยันว่าโปรแกรมที่จะเข้าสู่ภาวะชะงักงันโดยไม่คำนึงถึงการแทรกสอดสามารถเขียนได้ เราเขียนโปรแกรมดังกล่าวได้หรือไม่? ช่วยชี้ตัวอย่างโปรแกรมแบบนั้นให้หน่อยได้ไหม

8
จะรอ Futures หลาย ๆ ตัวได้อย่างไร?
สมมติว่าฉันมีอนาคตหลายอย่างและต้องรอจนกว่าสิ่งใดสิ่งหนึ่งจะล้มเหลวหรือประสบความสำเร็จทั้งหมด ตัวอย่างเช่น: Let มี 3 f1ฟิวเจอร์ส: f2, f3, หากf1ประสบความสำเร็จและf2ล้มเหลวฉันไม่รอf3(และส่งคืนความล้มเหลวให้กับลูกค้า) หากf2ล้มเหลวขณะที่f1และf3ยังคงทำงานผมไม่รอให้พวกเขา (และผลตอบแทนจากความล้มเหลว ) หากf1ประสบความสำเร็จแล้วf2ฉันก็รอต่อf3ไป คุณจะใช้มันอย่างไร?

2
รันไทม์คืออะไร Gosched ทำอะไร?
ในเวอร์ชันก่อนเปิดตัว go 1.5 ของเว็บไซต์ Tour of Goมีโค้ดส่วนหนึ่งที่มีลักษณะเช่นนี้ package main import ( "fmt" "runtime" ) func say(s string) { for i := 0; i < 5; i++ { runtime.Gosched() fmt.Println(s) } } func main() { go say("world") say("hello") } ผลลัพธ์มีลักษณะดังนี้: hello world hello world hello world hello world hello สิ่งที่รบกวนใจคือเมื่อruntime.Gosched()ถูกลบโปรแกรมจะไม่พิมพ์คำว่า "world" …
86 concurrency  go 


1
กรอบหน่วยความจำใช้ใน Java อะไร
ขณะที่พยายามที่จะเข้าใจว่าSubmissionPublisher( รหัสแหล่งที่มาใน Java SE 10 OpenJDK | เอกสาร ), คลาสใหม่เพิ่มเข้ามาใน Java SE ในรุ่นที่ 9 ได้รับการดำเนินฉัน stumbled ข้าม API โทรไม่กี่คนที่VarHandleฉันไม่ได้ก่อนหน้านี้ตระหนักถึง: fullFence, acquireFence, releaseFence, และloadLoadFencestoreStoreFence หลังจากทำวิจัยโดยเฉพาะอย่างยิ่งเกี่ยวกับแนวคิดของอุปสรรคหน่วยความจำ / รั้ว (ฉันเคยได้ยินพวกเขาก่อนหน้านี้ใช่ แต่ไม่เคยใช้พวกเขาจึงค่อนข้างไม่คุ้นเคยกับความหมายของพวกเขา) ฉันคิดว่าฉันมีความเข้าใจพื้นฐานของสิ่งที่พวกเขา . อย่างไรก็ตามเนื่องจากคำถามของฉันอาจเกิดขึ้นจากการเข้าใจผิดฉันต้องการให้แน่ใจว่าฉันได้รับมันตั้งแต่แรก: อุปสรรคหน่วยความจำกำลัง จำกัด ข้อ จำกัด ใหม่เกี่ยวกับการอ่านและการเขียน อุปสรรคหน่วยความจำสามารถแบ่งออกเป็นสองประเภทหลัก: อุปสรรคหน่วยความจำทิศทางเดียวและแบบสองทิศทางขึ้นอยู่กับว่าพวกเขาตั้งข้อ จำกัด ในการอ่านหรือเขียนหรือทั้งสองอย่าง c ++ สนับสนุนความหลากหลายของปัญหาและอุปสรรคที่หน่วยความจำVarHandleแต่เหล่านี้ไม่ตรงกับผู้ที่ให้บริการโดย แต่บางส่วนของปัญหาและอุปสรรคที่หน่วยความจำที่มีอยู่ในVarHandleให้ผลกระทบการสั่งซื้อที่มีเข้ากันได้จะสอดคล้อง c ++ อุปสรรคหน่วยความจำของพวกเขา #fullFence เข้ากันได้กับ atomic_thread_fence(memory_order_seq_cst) …

2
Java หยุดบริการผู้ปฏิบัติการเมื่องานที่ได้รับมอบหมายอย่างใดอย่างหนึ่งของเขาล้มเหลวด้วยเหตุผลใด
ฉันต้องการบริการบางประเภทที่จะทำงานสองสามอย่างพร้อมกันและในช่วงเวลา 1 วินาทีเป็นเวลา 1 นาที หากงานใดงานหนึ่งล้มเหลวฉันต้องการหยุดบริการและงานทุกอย่างที่วิ่งไปพร้อมกับตัวบ่งชี้บางอย่างที่มีบางอย่างผิดปกติมิฉะนั้นหากหลังจากผ่านไปหนึ่งนาทีทุกอย่างไปได้ดีบริการจะหยุดทำงานโดยมีตัวบ่งชี้ว่า ตัวอย่างเช่นฉันมี 2 ฟังก์ชั่น: Runnable task1 = ()->{ int num = Math.rand(1,100); if (num < 5){ throw new Exception("something went wrong with this task,terminate"); } } Runnable task2 = ()->{ int num = Math.rand(1,100) return num < 50; } ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2); task1schedule = …

2
Corotines Kotlin“ รับประกันก่อนเกิด”
corotines Kotlin ให้การรับประกัน "ที่เกิดขึ้นก่อนหน้า" หรือไม่? ตัวอย่างเช่นมีการรับประกัน "ที่เกิดขึ้นก่อน" ระหว่างการเขียนถึงmutableVarและการอ่านในภายหลัง (อาจ) เธรดอื่น ๆ ในกรณีนี้: suspend fun doSomething() { var mutableVar = 0 withContext(Dispatchers.IO) { mutableVar = 1 } System.out.println("value: $mutableVar") } แก้ไข: บางทีตัวอย่างเพิ่มเติมอาจทำให้คำถามชัดเจนขึ้นเพราะมันมากขึ้น Kotlin-ish (ยกเว้นความไม่แน่นอน) โค้ดนี้ปลอดภัยสำหรับเธรดหรือไม่: suspend fun doSomething() { var data = withContext(Dispatchers.IO) { Data(1) } System.out.println("value: ${data.data}") } private data …

2
อะไรรับประกันกับ C ++ std :: atomic ในระดับโปรแกรมเมอร์?
ฉันได้ฟังและอ่านบทความพูดคุยและคำถามเกี่ยวกับสแต็คโอเวอร์โฟลว์หลายเรื่องstd::atomicแล้วและฉันต้องการให้แน่ใจว่าฉันเข้าใจดี เนื่องจากฉันยังสับสนอยู่เล็กน้อยกับบรรทัดแคชเขียนการมองเห็นเนื่องจากความล่าช้าที่เป็นไปได้ในโปรโตคอลการเชื่อมโยงกันของแคช MESI (หรือที่ได้รับ) บัฟเฟอร์ที่เก็บบัฟเฟอร์คิวที่ไม่ถูกต้องและอื่น ๆ ฉันอ่าน x86 มีโมเดลหน่วยความจำที่แรงกว่าและหากการตรวจสอบความถูกต้องแคชล่าช้า x86 สามารถยกเลิกการดำเนินการที่เริ่มต้นได้ แต่ตอนนี้ฉันสนใจเฉพาะสิ่งที่ฉันควรถือว่าเป็นโปรแกรมเมอร์ C ++ ซึ่งเป็นอิสระจากแพลตฟอร์ม [T1: thread1 T2: thread2 V1: ตัวแปรอะตอมมิกที่ใช้ร่วมกัน] ฉันเข้าใจว่า std :: atomic รับประกันว่า (1) ไม่มีการแย่งข้อมูลในตัวแปร (ต้องขอบคุณการเข้าถึงสายแคชเท่านั้น) (2) หน่วยความจำที่เราใช้นั้นขึ้นอยู่กับหน่วยความจำที่รับประกันว่า (มีสิ่งกีดขวาง) ซึ่งความสอดคล้องตามลำดับจะเกิดขึ้น (3) หลังจากการเขียนอะตอมมิก (V1) บน T1 อะตอมมิก RMW (V1) บน T2 จะสอดคล้องกัน (บรรทัดแคชจะได้รับการอัพเดตด้วยค่าที่เขียนบน T1) แต่เมื่อไพรเมอร์เชื่อมโยงกันถึงแคช ความหมายของสิ่งเหล่านี้คือโดยค่าเริ่มต้นการโหลดสามารถดึงข้อมูลเก่า (ถ้าคำขอการตรวจสอบความถูกต้องที่สอดคล้องกันกำลังนั่งอยู่ในคิวการตรวจสอบความถูกต้อง) ดังนั้นถูกต้องหรือไม่ …

1
ปลอดภัยหรือไม่ที่จะเรียกใช้พร้อมกัน :: concurrent_vector :: push_back ขณะที่วนซ้ำ concurrent_vector นั้นในเธรดอื่น?
push_back , เริ่มต้น , ปลายจะมีการอธิบายเป็นที่ปลอดภัยพร้อมกันใน https://docs.microsoft.com/en-us/cpp/parallel/concrt/reference/concurrent-vector-class?view=vs-2019#push_back อย่างไรก็ตามโค้ดด้านล่างนี้เป็นการยืนยัน อาจเป็นเพราะองค์ประกอบถูกเพิ่ม แต่ยังไม่ได้เริ่มต้น struct MyData { explicit MyData() { memset(arr, 0xA5, sizeof arr); } std::uint8_t arr[1024]; }; struct MyVec { concurrency::concurrent_vector<MyData> v; }; auto vector_pushback(MyVec &vec) -> void { vec.v.push_back(MyData{}); } auto vector_loop(MyVec &vec) -> void { MyData myData; for (auto it = vec.v.begin(); …

1
Parallel“ any” หรือ“ all” ใน Haskell
รูปแบบที่ฉันเจอหลายครั้งตอนนี้เป็นสิ่งที่รายการค่าต้องตรวจสอบโดยการทำแผนที่การทดสอบบางอย่างและดูว่าองค์ประกอบใด ๆ หรือทั้งหมดผ่าน การแก้ปัญหาโดยทั่วไปเป็นเพียงการใช้งานที่สะดวก built-ins และallany ปัญหาคือสิ่งเหล่านี้ประเมินในอนุกรม ในหลายกรณีมันจะมากได้เร็วขึ้นในการประเมินในแบบคู่ขนานกับกระบวนการเป็นครั้งเดียวที่สมบูรณ์ใด ๆด้ายพบ "เท็จ" สำหรับallหรือ "ทรู" anyสำหรับ ฉันค่อนข้างแน่ใจว่าพฤติกรรมการลัดวงจรไม่สามารถใช้งานได้โดยใช้ Control.Parallel เนื่องจากต้องใช้การสื่อสารระหว่างกระบวนการและฉันยังไม่เข้าใจที่ใดก็ตามที่อยู่ใกล้ Control.Concurrent พอที่จะใช้งานได้ มันเป็นรูปแบบที่ค่อนข้างธรรมดาในวิชาคณิตศาสตร์ (เช่น Miller-Rabin Primality) ดังนั้นฉันรู้สึกว่ามีบางคนอาจคิดหาวิธีแก้ปัญหานี้อยู่แล้ว แต่ด้วยเหตุผลที่ชัดเจนในการค้นหา google สำหรับ "ขนานหรือ / และ / ใด ๆ / ทั้งหมดในรายการ Haskell "ไม่แสดงผลลัพธ์ที่เกี่ยวข้องหลายรายการ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.