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

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

7
ซอมบี้มีอยู่จริงหรือไม่…ใน. NET?
ฉันมีการพูดคุยกับเพื่อนร่วมทีมเกี่ยวกับการล็อคใน. NET เขาเป็นคนที่สดใสจริงๆมีภูมิหลังที่กว้างขวางทั้งในระดับล่างและระดับสูงกว่าการเขียนโปรแกรม แต่ประสบการณ์ของเขาในการเขียนโปรแกรมระดับล่างต่ำกว่าของฉัน อย่างไรก็ตามเขาแย้งว่าการล็อค. NET ควรหลีกเลี่ยงในระบบที่มีความสำคัญซึ่งคาดว่าจะอยู่ภายใต้ภาระหนักหากเป็นไปได้ทั้งหมดเพื่อหลีกเลี่ยงความเป็นไปได้เล็กน้อยของ "zombie thread" ที่ล้มเหลวของระบบ ฉันใช้การล็อคเป็นประจำและฉันไม่รู้ว่า "zombie thread" คืออะไรฉันจึงถาม ความประทับใจที่ฉันได้รับจากคำอธิบายของเขาก็คือว่าซอมบี้เป็นเธรดที่ถูกยกเลิก แต่ก็ยังมีทรัพยากรบางอย่างอยู่ ตัวอย่างที่เขายกให้วิธีที่เธรด zombie สามารถทำให้ระบบแตกได้เธรดจะเริ่มโพรซีเดอร์หลังจากล็อกวัตถุบางตัว จากนั้นจะถึงจุดสิ้นสุดก่อนที่จะสามารถปลดล็อคได้ สถานการณ์นี้มีโอกาสที่จะเกิดความผิดพลาดของระบบเพราะในที่สุดความพยายามที่จะดำเนินการวิธีการจะส่งผลให้เธรดทั้งหมดกำลังรอการเข้าถึงวัตถุที่จะไม่ถูกส่งคืนเนื่องจากเธรดที่ใช้วัตถุที่ถูกล็อคจะตาย ฉันคิดว่าฉันได้รับส่วนสำคัญนี้ แต่ถ้าฉันไม่อยู่โปรดแจ้งให้เราทราบ แนวคิดนี้สมเหตุสมผลสำหรับฉัน ฉันไม่มั่นใจอย่างสมบูรณ์ว่านี่เป็นสถานการณ์จริงที่อาจเกิดขึ้นใน. NET ฉันไม่เคยได้ยินชื่อ "ซอมบี้" มาก่อน แต่ฉันจำได้ดีว่าโปรแกรมเมอร์ที่ทำงานในระดับลึกลงไปมีแนวโน้มที่จะมีความเข้าใจพื้นฐานการใช้คอมพิวเตอร์ (เช่นการทำเกลียว) ฉันเห็นคุณค่าในการล็อคแน่นอนและฉันได้เห็นโปรแกรมเมอร์ระดับโลกหลายคนใช้ประโยชน์จากการล็อค ฉันยังมีความสามารถ จำกัด ในการประเมินสิ่งนี้ด้วยตัวเองเพราะฉันรู้ว่าlock(obj)คำแถลงนั้นเป็นเพียงแค่ประโยคน้ำตาลสำหรับ: bool lockWasTaken = false; var temp = obj; try { Monitor.Enter(temp, ref lockWasTaken); { body …

4
เมื่อใดที่จะใช้ Task.Delay เมื่อใดที่จะใช้งาน Thread.Sleep
มีกฎที่ดีหรือไม่ที่จะใช้งานTaskDelayกับThread.Sleepเมื่อใด โดยเฉพาะมีค่าต่ำสุดที่จะให้เพื่อให้มีประสิทธิภาพ / มีประสิทธิภาพเหนืออื่น ๆ ? สุดท้ายเนื่องจาก Task.Delay ทำให้เกิดการสลับบริบทบนเครื่อง async / await มีค่าใช้จ่ายหรือไม่

9
std :: สัญญาคืออะไร?
ผมค่อนข้างคุ้นเคยกับ C ++ 11 std::thread, std::asyncและstd::futureส่วนประกอบ (เช่นดูคำตอบนี้ ) ซึ่งจะตรงไปข้างหน้า อย่างไรก็ตามฉันไม่สามารถเข้าใจได้ว่าstd::promiseมันคืออะไรมันทำอะไรและใช้ในสถานการณ์แบบไหนดีที่สุด เอกสารมาตรฐานนั้นไม่มีข้อมูลจำนวนมากเกินกว่าบทสรุปในชั้นเรียนและไม่มีเพียง :: เธรดเพียง ใครช่วยกรุณาstd::promiseเล่าตัวอย่างสั้น ๆ สังเขปของสถานการณ์ที่จำเป็นและเป็นวิธีแก้ปัญหาที่สำนวนที่สุด?

13
ตัวจัดการ vs AsyncTask กับเธรด [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน10 เดือนที่ผ่านมา ผมสับสนเล็กน้อยเกี่ยวกับความแตกต่างระหว่างHandlers, AsyncTaskและThreadsใน Android ฉันอ่านบล็อกและคำถามไม่กี่ที่นี่ใน StackOverflow Handlerเป็นเธรดพื้นหลังที่ให้คุณสามารถสื่อสารกับ UI ได้ Handlerการอัปเดตแถบความคืบหน้าเช่นที่ควรจะทำผ่านทาง การใช้ตัวจัดการคุณมีข้อได้เปรียบMessagingQueuesดังนั้นหากคุณต้องการกำหนดเวลาข้อความหรืออัปเดตองค์ประกอบ UI หลายรายการหรือทำงานซ้ำ AsyncTaskที่จริงแล้วมันคล้ายกันHandlerแต่ใช้ไม่ได้ในเธรด UI ดังนั้นจึงเป็นการดีสำหรับการดึงข้อมูลเช่นดึงข้อมูลบริการเว็บ หลังจากนั้นคุณสามารถโต้ตอบกับ UI Threadแต่ไม่สามารถโต้ตอบกับ UI ได้ แต่ให้เธรดขั้นพื้นฐาน "มากขึ้นและคุณจะพลาดภาพนามธรรมAsyncTaskทั้งหมด อย่างไรก็ตามฉันต้องการให้การเชื่อมต่อซ็อกเก็ตทำงานอยู่ในบริการ สิ่งนี้ควรถูกเรียกใช้ในตัวจัดการหรือเธรดหรือแม้แต่AsyncTask? การโต้ตอบกับ UI ไม่จำเป็นเลย มันสร้างความแตกต่างในแง่ของประสิทธิภาพที่ฉันใช้หรือไม่ ในขณะเดียวกันเอกสารได้รับการปรับปรุงอย่างมาก

22
หลีกเลี่ยงการซิงโครไนซ์ (นี่) ใน Java หรือไม่
เมื่อใดก็ตามที่มีคำถามปรากฏขึ้นบน SO เกี่ยวกับการซิงโครไนซ์ Java บางคนมีความกระตือรือร้นที่จะชี้ให้เห็นว่าsynchronized(this)ควรหลีกเลี่ยง แต่พวกเขาอ้างว่าต้องการล็อคตัวอ้างอิงส่วนตัวแทน เหตุผลบางประการที่กำหนดคือ: รหัสความชั่วร้ายบางอย่างอาจขโมยล็อคของคุณ (เป็นที่นิยมมากรหัสนี้มีตัวแปร "โดยไม่ตั้งใจ") วิธีการทำข้อมูลให้ตรงกันทั้งหมดภายในชั้นเดียวกันใช้ล็อคเดียวกันแน่นอนซึ่งช่วยลดปริมาณงาน คุณกำลังเปิดเผยข้อมูลมากเกินไปโดยไม่จำเป็น คนอื่นรวมถึงฉันเถียงว่าsynchronized(this)เป็นสำนวนที่ใช้บ่อยๆ (เช่นในห้องสมุด Java) มีความปลอดภัยและเข้าใจดี ไม่ควรหลีกเลี่ยงเพราะคุณมีข้อผิดพลาดและคุณไม่รู้ว่าเกิดอะไรขึ้นในโปรแกรมแบบมัลติเธรดของคุณ กล่าวอีกนัยหนึ่ง: ถ้ามันใช้ได้แล้วใช้มัน ฉันสนใจที่จะเห็นตัวอย่างในโลกแห่งความเป็นจริง (ไม่มีสิ่งใดสำหรับ foobar) ที่หลีกเลี่ยงการล็อกบนthisจะดีกว่าเมื่อsynchronized(this)จะทำงาน ดังนั้น: คุณควรหลีกเลี่ยงsynchronized(this)และแทนที่ด้วยล็อคในการอ้างอิงส่วนตัวหรือไม่? ข้อมูลเพิ่มเติมบางส่วน (อัปเดตเมื่อได้รับคำตอบแล้ว): เรากำลังพูดถึงการประสานอินสแตนซ์ ทั้งโดยนัย ( synchronizedวิธีการ) และรูปแบบที่ชัดเจนในการsynchronized(this)ได้รับการพิจารณา หากคุณอ้างถึง Bloch หรือหน่วยงานอื่น ๆ ในเรื่องนี้อย่าปล่อยชิ้นส่วนที่คุณไม่ชอบ (เช่น Java ที่มีประสิทธิภาพ, รายการเกี่ยวกับความปลอดภัยของกระทู้: โดยปกติแล้วมันจะล็อคตัวอินสแตนซ์เอง แต่มีข้อยกเว้น) หากคุณต้องการความละเอียดในการล็อคอื่น ๆ นอกเหนือจากข้อsynchronized(this)เสนอsynchronized(this)มันจะไม่สามารถใช้ได้ดังนั้นจึงไม่ใช่ปัญหา

25
วิธีการรอให้เธรดทั้งหมดเสร็จสิ้นโดยใช้ ExecutorService
ฉันต้องทำงานบางอย่างทีละ 4 อย่างเช่นนี้: ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { taskExecutor.execute(new MyTask()); } //...wait for completion somehow ฉันจะได้รับการแจ้งเตือนได้อย่างไรเมื่อทั้งหมดเสร็จสมบูรณ์ สำหรับตอนนี้ฉันไม่สามารถคิดอะไรได้ดีไปกว่าการตั้งตัวนับโกลบอลบางตัวและลดมันลงที่ส่วนท้ายของทุกภารกิจ หรือรับรายการ Futures และใน infinite loop monitor isDone สำหรับพวกเขาทั้งหมด อะไรคือวิธีแก้ปัญหาที่ดีกว่าที่ไม่เกี่ยวข้องกับการวนซ้ำไม่สิ้นสุด? ขอบคุณ

16
แอปพลิเคชันอาจทำงานได้มากเกินไปบนเธรดหลัก
ฉันยังใหม่กับสภาพแวดล้อม Android SDK / API นี่เป็นครั้งแรกที่ฉันพยายามวาดพล็อต / แผนภูมิ ฉันลองใช้โค้ดตัวอย่างชนิดต่าง ๆ กับอีมูเลเตอร์โดยใช้ไลบรารีที่แตกต่างกัน 3 ไลบรารีไม่มีอะไรแสดงในหน้าจอเลย์เอาต์ logcat กำลังทำซ้ำข้อความต่อไปนี้: W / Trace (1378): ค่าที่ไม่คาดคิดจาก nativeGetEnabledTags: 0 I / Choreographer (1378): ข้าม 55 เฟรม! แอปพลิเคชันอาจทำงานได้มากเกินไปบนเธรดหลัก ปัญหาไม่ได้เกิดขึ้นและแผนภูมิทำงานเมื่อฉันรันโค้ดตัวอย่างที่เกี่ยวข้องกับสำเนาการประเมินผลของไลเซนส์ไลบรารี่

8
ความแตกต่างระหว่างงานและด้ายคืออะไร?
ใน C # 4.0 เรามีTaskในSystem.Threading.Tasks namespace ความแตกต่างที่แท้จริงระหว่างThreadและTaskคืออะไร ฉันทำโปรแกรมตัวอย่าง (ความช่วยเหลือจาก MSDN) เพื่อการเรียนรู้ด้วยตัวเอง Parallel.Invoke Parallel.For Parallel.ForEach แต่มีข้อสงสัยมากมายเนื่องจากแนวคิดไม่ชัดเจน ฉันเคยค้นหาใน Stackoverflow สำหรับคำถามประเภทเดียวกัน แต่อาจอยู่กับชื่อคำถามนี้ฉันไม่สามารถได้รับเหมือนกัน หากใครรู้เกี่ยวกับคำถามประเภทเดียวกันที่โพสต์ไว้ที่นี่ก่อนหน้านี้โปรดให้ข้อมูลอ้างอิงจากลิงก์

26
Java: แจ้งเตือน () เทียบกับ alertAll () อีกครั้ง
ตั้งค่าใหม่ให้กับStack Overflow ที่ว่างอยู่แล้ว : แจ้งให้ทราบ, แจ้งเตือนทั้งหมด? หากหนึ่ง Google สำหรับ "ความแตกต่างระหว่างnotify()และnotifyAll()" คำอธิบายมากมายจะปรากฏขึ้น (แยกย่อหน้า javadoc) ทั้งหมดนี้ทำให้จำนวนเธรดที่รอรับการปลุกเพิ่มขึ้นหนึ่งครั้งnotify()และnotifyAll()ต่อเนื่อง อย่างไรก็ตาม (ถ้าฉันเข้าใจความแตกต่างระหว่างวิธีการเหล่านี้ถูกต้อง) มีเพียงหนึ่งเธรดเท่านั้นที่ถูกเลือกสำหรับการได้รับการตรวจสอบเพิ่มเติมเสมอ ในกรณีแรกรายการที่เลือกโดย VM ในกรณีที่สองรายการที่เลือกโดยตัวกำหนดเวลาระบบเธรด ขั้นตอนการเลือกที่แน่นอนสำหรับทั้งคู่ (ในกรณีทั่วไป) ไม่เป็นที่รู้จักสำหรับโปรแกรมเมอร์ สิ่งที่มีประโยชน์แตกต่างระหว่างการแจ้ง ()และnotifyAll ()แล้ว? ฉันพลาดอะไรไปรึเปล่า?

14
การอ้างอิงที่ไม่ได้กำหนดถึง pthread_create ใน Linux
ฉันเลือกตัวอย่างต่อไปนี้จากเว็บจากhttps://computing.llnl.gov/tutorials/pthreads/ #include <pthread.h> #include <stdio.h> #define NUM_THREADS 5 void *PrintHello(void *threadid) { long tid; tid = (long)threadid; printf("Hello World! It's me, thread #%ld!\n", tid); pthread_exit(NULL); } int main (int argc, char *argv[]) { pthread_t threads[NUM_THREADS]; int rc; long t; for(t=0; t<NUM_THREADS; t++){ printf("In main: creating thread %ld\n", t); rc = …



18
คำว่า "thread-safe" หมายถึงอะไร?
หมายความว่าสองเธรดไม่สามารถเปลี่ยนข้อมูลพื้นฐานพร้อมกันได้หรือไม่ หรือหมายความว่าส่วนรหัสที่กำหนดจะทำงานด้วยผลลัพธ์ที่สามารถคาดการณ์ได้เมื่อมีหลายเธรดที่กำลังเรียกใช้งานส่วนรหัสนั้น

11
วิธีรันเธรดที่เรียกใช้ได้ใน Android ตามช่วงเวลาที่กำหนด
ฉันพัฒนาแอพพลิเคชั่นเพื่อแสดงข้อความตามช่วงเวลาที่กำหนดในหน้าจอตัวจำลอง Android ฉันกำลังใช้Handlerชั้นเรียน นี่คือตัวอย่างจากรหัสของฉัน: handler = new Handler(); Runnable r = new Runnable() { public void run() { tv.append("Hello World"); } }; handler.postDelayed(r, 1000); เมื่อฉันเรียกใช้แอปพลิเคชันนี้ข้อความจะปรากฏเพียงครั้งเดียว ทำไม?

14
สัญญาณคืออะไร?
สัญญาณเป็นแนวคิดการเขียนโปรแกรมที่ใช้บ่อยในการแก้ปัญหาหลายเธรด คำถามของฉันถึงชุมชน: เซมาฟอร์คืออะไรและคุณใช้มันอย่างไร

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