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

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

4
Java Thread ขยะเก็บได้หรือไม่
คำถามนี้ถูกโพสต์ในบางไซต์ ฉันไม่พบคำตอบที่ถูกต้องดังนั้นฉันจึงโพสต์ที่นี่อีกครั้ง public class TestThread { public static void main(String[] s) { // anonymous class extends Thread Thread t = new Thread() { public void run() { // infinite loop while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { } // as long as this line printed out, …

10
การสิ้นสุดเธรด C # และเธรดเธรด ()
ใน MSDN คำอธิบายของเมธอด Thread.Abort () ระบุว่า: "การเรียกใช้เมธอดนี้มักจะยุติเธรด" ทำไมไม่อยู่เสมอ? ในกรณีใดบ้างที่ไม่ยุติเธรด มีความเป็นไปได้อื่น ๆ ในการยุติเธรดหรือไม่

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

7
เธรดทำงานอย่างไรใน Python และข้อผิดพลาดทั่วไปของ Python-threading คืออะไร
ฉันพยายามเข้าใจว่าเธรดทำงานอย่างไรใน Python และยากที่จะหาข้อมูลที่ดีเกี่ยวกับวิธีการทำงานของเธรด ฉันอาจจะขาดลิงค์หรืออะไรบางอย่างไป แต่ดูเหมือนว่าเอกสารอย่างเป็นทางการจะไม่ละเอียดถี่ถ้วนในเรื่องนี้และฉันไม่สามารถหางานเขียนที่ดีได้ จากสิ่งที่ฉันสามารถบอกได้มีเพียงเธรดเดียวเท่านั้นที่สามารถทำงานได้พร้อมกันและเธรดที่ใช้งานจะสลับทุกๆ 10 คำสั่งหรือมากกว่านั้น? มีคำอธิบายที่ดีตรงไหนหรือให้คำอธิบายได้ไหม นอกจากนี้ยังเป็นการดีมากที่จะทราบถึงปัญหาทั่วไปที่คุณพบขณะใช้เธรดกับ Python

4
การควบคุมเว็บเบราว์เซอร์ในเธรดใหม่
ฉันมีรายการ Uri ที่ฉันต้องการ "คลิก" เพื่อให้บรรลุสิ่งนี้ฉันพยายามสร้างการควบคุมเว็บเบราว์เซอร์ใหม่ต่อ Uri ฉันสร้างเธรดใหม่ต่อ Uri ปัญหาที่ฉันพบคือเธรดสิ้นสุดก่อนเอกสาร โหลดเต็มดังนั้นฉันจึงไม่สามารถใช้ประโยชน์จากเหตุการณ์ DocumentComplete ได้ฉันจะเอาชนะสิ่งนี้ได้อย่างไร var item = new ParameterizedThreadStart(ClicIt.Click); var thread = new Thread(item) {Name = "ClickThread"}; thread.Start(uriItem); public static void Click(object o) { var url = ((UriItem)o); Console.WriteLine(@"Clicking: " + url.Link); var clicker = new WebBrowser { ScriptErrorsSuppressed = true }; …

3
โปรแกรมมัลติเธรดติดอยู่ในโหมดปรับให้เหมาะสม แต่จะทำงานตามปกติใน -O0
ฉันเขียนโปรแกรมหลายเธรดแบบง่าย ๆ ดังนี้: static bool finished = false; int func() { size_t i = 0; while (!finished) ++i; return i; } int main() { auto result=std::async(std::launch::async, func); std::this_thread::sleep_for(std::chrono::seconds(1)); finished=true; std::cout<<"result ="<<result.get(); std::cout<<"\nmain thread id="<<std::this_thread::get_id()<<std::endl; } มันทำงานตามปกติในโหมดดีบั๊กในVisual Studioหรือ-O0ในgc c และพิมพ์ผลหลังจากนั้นไม่1กี่วินาที แต่มันติดอยู่และไม่ได้พิมพ์อะไรในรีลีส-O1 -O2 -O3หรือโหมด

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

7
จะสร้างตัวโหลดพื้นหลังบล็อกใน Java 8 ได้อย่างไร?
คำถาม คุณสร้างตัวโหลดพื้นหลังที่เหมาะสมใน Java 8 ได้อย่างไร? เงื่อนไข: ควรโหลดข้อมูลในพื้นหลัง หลังจากการโหลดข้อมูลควรจะปรากฏขึ้น ในขณะที่โหลดข้อมูลไม่จำเป็นต้องยอมรับคำขอใด ๆ เพิ่มเติม หากมีการร้องขอในขณะที่ข้อมูลถูกโหลดอีกครั้งการโหลดควรกำหนดเวลาหลังจากหมดเวลาที่แน่นอน (เช่น 5 วินาที) จุดประสงค์คือเพื่อรับคำขอโหลดซ้ำ แต่ไม่ใช่ฐานข้อมูลที่เต็มไปด้วยคำขอ MCVE นี่คือ MCVE ประกอบด้วยงานพื้นหลังซึ่งจำลองการโหลดโดยเรียกใช้ Thread.sleep เป็นเวลา 2 วินาที งานถูกกำหนดเวลาไว้ทุก ๆ วินาทีซึ่งโดยธรรมชาติจะนำไปสู่การทับซ้อนของงานโหลดพื้นหลังซึ่งควรหลีกเลี่ยง public class LoadInBackgroundExample { /** * A simple background task which should perform the data loading operation. In this minimal example it …

1
การวางไข่เธรดให้การรับประกันคำสั่งหน่วยความจำด้วยตัวเองหรือไม่?
ฉันต้องการทำอย่างนี้: กระทู้เริ่มต้น: เขียนค่าบางอย่างไปยัง vars ส่วนกลาง (จะไม่ถูกเขียนอีกครั้ง) นี่อาจเป็นข้อมูลขนาดใหญ่พอสมควร (อาร์เรย์สตริง ฯลฯ ) สามารถไม่เพียง std::atomic<>แต่จะทำ วางไข่หัวข้ออื่น ๆ หัวข้ออื่น ๆ : อ่านสถานะโลก ทำงาน ฯลฯ ตอนนี้ฉันรู้ว่าฉันสามารถส่งผ่านข้อโต้แย้งไปstd::threadได้ แต่ฉันพยายามเข้าใจการรับประกันหน่วยความจำของ C ++ ผ่านตัวอย่างนี้ นอกจากนี้ฉันค่อนข้างมั่นใจว่าในการใช้งานจริงใด ๆ การสร้างเธรดจะทำให้สิ่งกีดขวางหน่วยความจำทำให้มั่นใจว่าเธรดสามารถ "เห็น" ทุกสิ่งที่เธรดเธรดเขียนขึ้นจนถึงจุดนั้น แต่คำถามของฉันคือ: สิ่งนี้รับประกันโดยมาตรฐานหรือไม่ นอกเหนือ: ฉันคิดว่าฉันสามารถเพิ่มหุ่นบางตัวstd::atomic<int>หรือมากกว่านั้นและเขียนลงในนั้นก่อนที่จะเริ่มหัวข้ออื่น ๆ จากนั้นในหัวข้ออื่น ๆ อ่านครั้งเดียวเมื่อเริ่มต้น ฉันเชื่อว่าสิ่งที่เกิดขึ้นก่อนที่เครื่องจักรจะรับประกันได้ว่ารัฐทั่วโลกที่เขียนไว้ก่อนหน้านี้จะมองเห็นได้อย่างถูกต้อง แต่คำถามของฉันคือถ้าสิ่งที่ต้องการในเชิงเทคนิคหรือการสร้างเธรดเพียงพอหรือไม่

3
c ++ เธรดภายในเพื่อวนซ้ำค่าที่ไม่ถูกต้อง
ฉันพยายามที่จะเข้าใจ Multi-Threading ใน c ++ แต่ฉันติดอยู่กับปัญหานี้: ถ้าฉันเริ่มใช้เธรดในลูปพวกเขาพิมพ์ค่าผิด นี่คือรหัส: #include <iostream> #include <list> #include <thread> void print_id(int id){ printf("Hello from thread %d\n", id); } int main() { int n=5; std::list<std::thread> threads={}; for(int i=0; i<n; i++ ){ threads.emplace_back(std::thread([&](){ print_id(i); })); } for(auto& t: threads){ t.join(); } return 0; } ฉันคาดหวังว่าจะได้รับการพิมพ์ค่า 0,1,2,3,4 แต่ฉันมักจะได้รับค่าเดียวกันสองครั้ง …

4
การใช้ CPU ต่ำเกินไปของ Java Application แบบหลายเธรดบน Windows
ฉันกำลังทำงานกับแอปพลิเคชัน Java เพื่อแก้ปัญหาการเพิ่มประสิทธิภาพเชิงตัวเลข - ปัญหาการเขียนโปรแกรมเชิงเส้นขนาดใหญ่ให้แม่นยำยิ่งขึ้น ปัญหาเดียวสามารถแบ่งออกเป็นปัญหาย่อยที่เล็กกว่าที่สามารถแก้ไขได้ในแบบคู่ขนาน เนื่องจากมีปัญหาย่อยมากกว่าคอร์ CPU ฉันจึงใช้ ExecutorService และกำหนดแต่ละปัญหาย่อยเป็น Callable ที่ได้รับการส่งไปยัง ExecutorService การแก้ปัญหาย่อยต้องเรียกไลบรารี่เนทีฟซึ่งเป็นตัวแก้ปัญหาการโปรแกรมเชิงเส้นในกรณีนี้ ปัญหา ฉันสามารถรันแอพพลิเคชั่นบน Unix และระบบ Windows ที่มีฟิสิคัลคอร์สูงสุด 44 คอร์และหน่วยความจำสูงสุด 256g แต่เวลาในการคำนวณบนวินโดวส์นั้นมีลำดับความสำคัญสูงกว่าบน Linux สำหรับปัญหาใหญ่ Windows ไม่เพียง แต่ต้องใช้หน่วยความจำเพิ่มมากขึ้น แต่การใช้งาน CPU ในช่วงเวลานั้นลดลงจาก 25% ในช่วงเริ่มต้นเป็น 5% หลังจากผ่านไปสองสามชั่วโมง นี่คือภาพหน้าจอของตัวจัดการงานใน Windows: ข้อสังเกต เวลาในการแก้ปัญหาสำหรับอินสแตนซ์ขนาดใหญ่ของปัญหาโดยรวมอยู่ในช่วงชั่วโมงต่อวันและใช้หน่วยความจำมากถึง 32 กรัม (บน Unix) เวลาแก้ปัญหาสำหรับปัญหาย่อยอยู่ในช่วง ms ฉันไม่พบปัญหานี้ในปัญหาเล็ก ๆ ที่ใช้เวลาเพียงไม่กี่นาทีในการแก้ไข …

2
เธรด C ++ ที่ใช้ฟังก์ชั่นวัตถุจะมีตัวเรียกว่า destructors หลายตัว แต่ไม่ใช่ตัวสร้าง
โปรดค้นหาข้อมูลโค้ดด้านล่าง: class tFunc{ int x; public: tFunc(){ cout<<"Constructed : "<<this<<endl; x = 1; } ~tFunc(){ cout<<"Destroyed : "<<this<<endl; } void operator()(){ x += 10; cout<<"Thread running at : "<<x<<endl; } int getX(){ return x; } }; int main() { tFunc t; thread t1(t); if(t1.joinable()) { cout<<"Thread is joining..."<<endl; t1.join(); } …

2
ปัญหาประสิทธิภาพขนานหลายเธรดกับลำดับฟีโบนักชีในจูเลีย (1.3)
ฉันกำลังลองใช้ฟังก์ชันมัลติเธรดJulia 1.3ด้วยฮาร์ดแวร์ต่อไปนี้: Model Name: MacBook Pro Processor Name: Intel Core i7 Processor Speed: 2.8 GHz Number of Processors: 1 Total Number of Cores: 4 L2 Cache (per Core): 256 KB L3 Cache: 6 MB Hyper-Threading Technology: Enabled Memory: 16 GB เมื่อรันสคริปต์ต่อไปนี้: function F(n) if n < 2 return n else …

2
Java ThreadPoolExecutor: การอัปเดตขนาดพูหลักปฏิเสธงานที่เข้ามาเป็นระยะ ๆ แบบไดนามิก
ฉันกำลังประสบปัญหาซึ่งถ้าฉันพยายามปรับขนาดThreadPoolExecutorแกนกลางของสระว่ายน้ำให้เป็นจำนวนที่แตกต่างกันหลังจากที่สร้างกลุ่มนั้นเป็นระยะ ๆ งานบางอย่างถูกปฏิเสธด้วยงานRejectedExecutionExceptionแม้ว่าฉันจะไม่ส่งงานมากกว่าqueueSize + maxPoolSizeจำนวน ปัญหาที่ฉันพยายามแก้ไขคือการขยายThreadPoolExecutorที่ปรับขนาดเธรดหลักตามการดำเนินการที่ค้างอยู่ซึ่งอยู่ในคิวของเธรดพูล ฉันต้องการสิ่งนี้เพราะโดยปกติแล้ว a ThreadPoolExecutorจะสร้างใหม่Threadเฉพาะเมื่อคิวเต็ม นี่คือโปรแกรม Pure Java 8 ขนาดเล็กที่มีในตัวเองซึ่งแสดงให้เห็นถึงปัญหา import static java.lang.Math.max; import static java.lang.Math.min; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolResizeTest { public static void main(String[] args) throws Exception { // increase the number of iterations …

4
คำอธิบายของการสั่งซื้อที่ผ่อนคลายผิดพลาดใน cppreference หรือไม่?
ในเอกสารประกอบของstd::memory_orderบน cppreference.comมีตัวอย่างของการสั่งซื้อแบบผ่อนคลาย: สั่งผ่อนคลาย การดำเนินการของอะตอมมิกที่ติดแท็กmemory_order_relaxedไม่ใช่การดำเนินการทำข้อมูลให้ตรงกัน พวกเขาไม่ได้กำหนดลำดับการเข้าถึงหน่วยความจำพร้อมกัน พวกเขารับประกันเฉพาะอะตอมมิกและความสอดคล้องของคำสั่งแก้ไข ตัวอย่างเช่นเมื่อ x และ y เริ่มต้นที่ศูนย์ // Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D ได้รับอนุญาตให้สร้าง r1 == r2 == 42 เพราะถึงแม้ว่า A จะถูกจัดลำดับก่อนหน้า B ภายในเธรด 1 และ C ถูกเรียงตามลำดับก่อนหน้า …

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