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

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


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

5
การทำความเข้าใจ std :: atomic :: Compare_exchange_weak () ใน C ++ 11
bool compare_exchange_weak (T& expected, T val, ..); compare_exchange_weak()เป็นหนึ่งในการเปรียบเทียบแบบดั้งเดิมของการแลกเปลี่ยนที่มีให้ใน C ++ 11 มันอ่อนแอexpectedในแง่ที่ว่ามันกลับเท็จแม้ว่ามูลค่าของวัตถุที่มีค่าเท่ากับ นี่เป็นเพราะความล้มเหลวปลอมในบางแพลตฟอร์มที่มีการใช้ลำดับของคำสั่ง (แทนที่จะเป็นหนึ่งใน x86) เพื่อใช้งาน บนแพลตฟอร์มดังกล่าวการสลับบริบทการโหลดที่อยู่เดียวกัน (หรือบรรทัดแคช) ซ้ำโดยเธรดอื่น ฯลฯ อาจทำให้ระบบดั้งเดิมล้มเหลว มันspuriousไม่ใช่ค่าของวัตถุ (ไม่เท่ากับexpected) ที่ทำให้การดำเนินการล้มเหลว แต่มันเป็นปัญหาเรื่องเวลา แต่สิ่งที่ทำให้ฉันไขปริศนาคือสิ่งที่พูดใน C ++ 11 Standard (ISO / IEC 14882) 29.6.5 .. ผลที่ตามมาของความล้มเหลวปลอมคือการใช้การเปรียบเทียบและแลกเปลี่ยนที่อ่อนแอเกือบทั้งหมดจะวนเวียน เหตุใดจึงต้องวนซ้ำในการใช้งานเกือบทั้งหมด ? นั่นหมายความว่าเราจะวนซ้ำเมื่อมันล้มเหลวเพราะความล้มเหลวปลอม ๆ ? ถ้าเป็นเช่นนั้นทำไมเราต้องใช้compare_exchange_weak()และเขียนลูปด้วยตัวเอง? เราสามารถใช้compare_exchange_strong()สิ่งที่ฉันคิดว่าควรกำจัดความล้มเหลวปลอมให้เราได้ อะไรคือกรณีการใช้งานทั่วไปของcompare_exchange_weak()? คำถามอื่นที่เกี่ยวข้อง ในหนังสือของเขา "C ++ Concurrency …

5
ตัวเลือกลิงค์ที่ถูกต้องในการใช้ std :: thread ใน GCC ภายใต้ linux คืออะไร?
สวัสดีฉันกำลังพยายามใช้std::threadกับ G ++ นี่คือรหัสทดสอบของฉัน #include <thread> #include <iostream> int main(int, char **){ std::thread tt([](){ std::cout<<"Thread!"<<std::endl; }); tt.join(); } มันรวบรวม แต่เมื่อฉันพยายามเรียกใช้ผลลัพธ์คือ: terminate called after throwing an instance of 'std::system_error' what(): Operation not permitted Aborted เวอร์ชันคอมไพเลอร์ของฉัน: $ g++ --version g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 Copyright (C) 2011 Free Software Foundation, Inc. This is …

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

6
ความหมายของจอภาพของวัตถุใน Java คืออะไร? ทำไมต้องใช้คำนี้?
เมื่ออ่านบทความเกี่ยวกับเธรด Java ฉันมักจะสังเกตเห็นนิพจน์: "เธรดปัจจุบันเป็นเจ้าของจอภาพของอ็อบเจ็กต์นี้" ฉันเข้าใจความหมาย: เธรดได้รับสิทธิ์ในการทำงานกับวัตถุ แต่ฉันงงว่าทำไมเราถึงใช้วลี "the object's monitor" แทน "the object's lock"? โดยสรุปฉันไม่รู้ความหมายของคำว่า 'มอนิเตอร์' คำถามอาจจะแปลกและเรียบง่าย แต่ฉันหวังว่าใครก็ได้สามารถช่วยแก้ไขได้ 3ks

6
มัลติเธรดแบบไม่ต้องล็อคมีไว้สำหรับผู้เชี่ยวชาญด้านเธรดตัวจริง
ฉันกำลังอ่านคำตอบที่Jon Skeetให้กับคำถามและในนั้นเขาพูดถึงสิ่งนี้: เท่าที่ฉันกังวลการมัลติเธรดแบบไม่ต้องล็อคนั้นมีไว้สำหรับผู้เชี่ยวชาญด้านเธรดตัวจริงซึ่งฉันไม่ใช่คนเดียว ไม่ใช่ครั้งแรกที่ฉันได้ยินสิ่งนี้ แต่ฉันพบว่ามีคนน้อยมากที่พูดถึงวิธีการที่คุณทำได้จริงหากคุณสนใจที่จะเรียนรู้วิธีการเขียนโค้ดมัลติเธรดแบบไม่ต้องล็อก ดังนั้นคำถามของฉันคือนอกเหนือจากการเรียนรู้ทุกสิ่งที่คุณทำได้เกี่ยวกับเธรด ฯลฯ คุณจะเริ่มพยายามเรียนรู้การเขียนโค้ดมัลติเธรดแบบไม่ล็อคโดยเฉพาะและแหล่งข้อมูลที่ดีมีอะไรบ้าง ไชโย

6
ประสิทธิภาพของตัวแปร ThreadLocal
อ่านจากThreadLocalตัวแปรช้ากว่าจากฟิลด์ปกติมากแค่ไหน? การสร้างวัตถุอย่างง่ายเร็วกว่าหรือช้ากว่าการเข้าถึงThreadLocalตัวแปรคืออะไร? ฉันคิดว่ามันเร็วพอที่จะมีThreadLocal<MessageDigest>อินสแตนซ์ได้เร็วขึ้นมากจากนั้นสร้างอินสแตนซ์MessageDigestทุกครั้ง แต่นั่นยังใช้กับไบต์ [10] หรือไบต์ [1000] ด้วยเช่นกัน แก้ไข: คำถามคือเกิดอะไรขึ้นเมื่อโทรไปThreadLocal? ถ้านั่นเป็นเพียงสนามเช่นอื่น ๆ คำตอบก็จะเป็น "มันเร็วที่สุดเสมอ" ใช่ไหม?

8
ใครเป็นคนเรียกเมธอด Java Thread interrupt () ถ้าฉันไม่ใช่
ฉันได้อ่านและอ่าน Java Concurrency in Practice อีกครั้งฉันได้อ่านหัวข้อต่างๆที่นี่ในหัวข้อนี้ฉันได้อ่านบทความของ IBM เกี่ยวกับการจัดการกับ InterruptedExceptionและยังมีบางอย่างที่ฉันไม่เข้าใจซึ่งฉันคิดว่าอาจเสียได้ แบ่งออกเป็นสองคำถาม: ถ้าฉันไม่เคยรบกวนหัวข้ออื่น ๆ ตัวเองสิ่งที่สามารถเรียกInterruptedException ? ถ้าฉันไม่เคยรบกวนหัวข้ออื่น ๆ ด้วยตัวเองโดยใช้ขัดจังหวะ () (พูดเพราะผมใช้วิธีการอื่นในการยกเลิกหัวข้อการทำงานของฉันเช่นยาพิษและในขณะที่ (! ยกเลิก)ห่วงสไตล์ [ขณะที่ทั้งสองได้อธิบายไว้ใน Jcip]) สิ่งที่ ไม่InterruptedExceptionนั้นหมายความว่าอย่างไร ฉันควรทำอย่างไรเมื่อจับได้ ปิดแอพของฉันไหม

6
วัตถุที่ถูกล็อกจะยังคงถูกล็อกอยู่หรือไม่หากเกิดข้อยกเว้นขึ้นภายใน
ในแอพ ac # threading ถ้าฉันจะล็อคอ็อบเจกต์ให้เราพูดคิวและถ้ามีข้อยกเว้นเกิดขึ้นอ็อบเจกต์จะยังคงล็อคอยู่หรือไม่ นี่คือรหัสหลอก: int ii; lock(MyQueue) { MyClass LclClass = (MyClass)MyQueue.Dequeue(); try { ii = int.parse(LclClass.SomeString); } catch { MessageBox.Show("Error parsing string"); } } ตามที่ฉันเข้าใจรหัสหลังจากการจับไม่ได้ดำเนินการ - แต่ฉันสงสัยว่าการล็อกจะถูกปลดปล่อยหรือไม่

2
Armadillo แก้ด้าย () ปลอดภัยหรือไม่?
ในโค้ดของฉันฉันมีลูปที่ฉันสร้างและมากกว่าระบบเชิงเส้นที่กำหนดและพยายามแก้ปัญหา: #pragma omp parallel for for (int i = 0; i < n[0]+1; i++) { for (int j = 0; j < n[1]+1; j++) { for (int k = 0; k < n[2]+1; k++) { arma::mat A(max_points, 2); arma::mat y(max_points, 1); // initialize A and y arma::vec solution = solve(A,y); …

4
Java: Thread.currentThread (). sleep (x) กับ Thread.sleep (x)
ฉันมีสิ่งนี้ในรหัสของฉัน Thread.currentThread().sleep(x); Eclipse บอกให้ฉันใช้แบบคงที่ Thread.sleep(x); แทนทำไม? อะไรคือความแตกต่างในการทำงานระหว่าง 2 วิธีนี้มีความแตกต่างกันบ้าง?

13
คีย์เวิร์ดที่ลบเลือน C ++ แนะนำรั้วหน่วยความจำหรือไม่
ฉันเข้าใจว่าvolatileแจ้งให้คอมไพเลอร์ทราบว่าค่าอาจมีการเปลี่ยนแปลง แต่เพื่อให้ฟังก์ชันนี้สำเร็จคอมไพเลอร์จำเป็นต้องแนะนำรั้วหน่วยความจำเพื่อให้ใช้งานได้หรือไม่ จากความเข้าใจของฉันลำดับของการดำเนินการกับวัตถุระเหยไม่สามารถจัดเรียงใหม่ได้และต้องรักษาไว้ สิ่งนี้ดูเหมือนจะบ่งบอกถึงความทรงจำบางอย่างที่จำเป็นและไม่มีทางแก้ไขได้ ฉันพูดถูกต้องหรือเปล่า มีการอภิปรายที่น่าสนใจสำหรับคำถามที่เกี่ยวข้องนี้ Jonathan Wakely เขียน : ... การเข้าถึงตัวแปรระเหยที่แตกต่างกันไม่สามารถจัดลำดับใหม่โดยคอมไพเลอร์ได้ตราบเท่าที่เกิดขึ้นในนิพจน์เต็มแยกต่างหาก ... ใช่ว่าการระเหยนั้นไร้ประโยชน์สำหรับความปลอดภัยของเธรด แต่ไม่ใช่ด้วยเหตุผลที่เขาให้ ไม่ใช่เพราะคอมไพเลอร์อาจจัดลำดับการเข้าถึงวัตถุที่ระเหยได้ แต่เป็นเพราะ CPU อาจเรียงลำดับใหม่ การดำเนินการของอะตอมและอุปสรรคของหน่วยความจำป้องกันไม่ให้คอมไพเลอร์และ CPU จัดลำดับใหม่ ซึ่งDavid Schwartzตอบกลับในความคิดเห็น : ... ไม่มีความแตกต่างจากมุมมองของมาตรฐาน C ++ ระหว่างคอมไพเลอร์กำลังทำอะไรบางอย่างกับคอมไพเลอร์ส่งคำสั่งที่ทำให้ฮาร์ดแวร์ทำบางอย่าง หากซีพียูอาจจัดลำดับการเข้าถึงใหม่ไปยัง volatiles มาตรฐานก็ไม่จำเป็นต้องรักษาลำดับของมันไว้ ... ... มาตรฐาน C ++ ไม่ได้สร้างความแตกต่างเกี่ยวกับสิ่งที่จัดลำดับใหม่ และคุณไม่สามารถโต้แย้งได้ว่า CPU สามารถเรียงลำดับใหม่ได้โดยไม่มีเอฟเฟกต์ที่สังเกตเห็นได้ดังนั้นจึงไม่เป็นไร - มาตรฐาน C ++ กำหนดลำดับของมันให้สังเกตได้ คอมไพเลอร์เป็นไปตามมาตรฐาน C ++ …

6
จะยุติเธรดเมื่อโปรแกรมหลักสิ้นสุดได้อย่างไร?
ถ้าฉันมีเธรดในการวนซ้ำแบบไม่มีที่สิ้นสุดจะมีวิธียุติเธรดเมื่อโปรแกรมหลักสิ้นสุดลงหรือไม่ (เช่นเมื่อฉันกดCtrl+ C)

6
จะตรวจสอบได้อย่างไรว่าเธรด std :: ยังทำงานอยู่หรือไม่
ฉันจะตรวจสอบได้อย่างไรว่า a std::threadยังทำงานอยู่ (ในรูปแบบที่ไม่ขึ้นกับแพลตฟอร์ม) มันขาดtimed_join()วิธีการและjoinable()ไม่มีความหมายสำหรับสิ่งนั้น ฉันคิดว่าจะล็อค mutex ด้วยstd::lock_guardเธรดและใช้try_lock()วิธีการของ mutex เพื่อตรวจสอบว่ามันยังคงถูกล็อกอยู่หรือไม่ (เธรดกำลังทำงานอยู่) แต่ดูเหมือนว่าฉันจะซับซ้อนโดยไม่จำเป็น คุณรู้วิธีที่หรูหรากว่านี้หรือไม่? อัปเดต:เพื่อความชัดเจน: ฉันต้องการตรวจสอบว่าเธรดออกอย่างสมบูรณ์หรือไม่ ถือว่าด้าย 'ห้อย' ทำงานเพื่อจุดประสงค์นี้

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