เธรด c++ - การประมวลผลแบบขนาน

ฉันสงสัยว่าจะดำเนินการสองกระบวนการในโปรเซสเซอร์ดูอัลคอร์ใน c ++ ได้อย่างไร

ฉันรู้ว่าเธรด (หรือมัลติเธรด) ไม่ใช่คุณสมบัติในตัวของ c ++

มีการสนับสนุนเธรดใน Qt แต่ฉันไม่เข้าใจอะไรเลยจากการอ้างอิงของพวกเขา :(

แล้วมีใครรู้วิธีง่ายๆ สำหรับมือใหม่บ้างคะ การสนับสนุนข้ามแพลตฟอร์ม (เช่น Qt) จะมีประโยชน์มากเนื่องจากฉันใช้ Linux


person Kid Green    schedule 19.04.2011    source แหล่งที่มา


คำตอบ (6)


ลองใช้ มัลติเธรดใน C+ +0x ส่วนที่ 1: การเริ่มเธรดเป็น 101 หากคอมไพเลอร์ของคุณไม่มี C รองรับ ++0x จากนั้นใช้ Boost.Thread

person dubnde    schedule 19.04.2011

ดูที่ Boost.Thread นี่คือข้ามแพลตฟอร์มและเป็นไลบรารีที่ดีมากสำหรับใช้ในแอปพลิเคชัน C++ ของคุณ

คุณอยากรู้อะไรโดยเฉพาะ?

person murrekatt    schedule 19.04.2011

ไลบรารีเธรด POSIX (pthreads) น่าจะเป็นทางออกที่ดีที่สุดของคุณ หากคุณต้องการไลบรารีเธรดแบบธรรมดา ซึ่งมีการใช้งานทั้งบน Windows และ Linux

สามารถดูคำแนะนำได้เช่น ที่นี่ สามารถดาวน์โหลดการนำ pthreads ไปใช้ Win32 ได้ที่นี่

แก้ไข: ไม่เห็นว่าคุณอยู่บน Linux ในกรณีนั้นฉันไม่แน่ใจ 100% แต่ฉันคิดว่าไลบรารีอาจรวมอยู่ในการติดตั้ง GCC ของคุณแล้ว

person Rune Aamodt    schedule 19.04.2011

ฉันขอแนะนำให้ใช้ไลบรารี Boost Boost.Thread แทน. ซึ่งจะรวมเฉพาะแพลตฟอร์มของ Win32 และ Posix และให้ชุดเธรดและการซิงโครไนซ์ออบเจ็กต์ที่มั่นคงแก่คุณ นอกจากนี้ยังมีการใช้งานหนักมาก ดังนั้นการค้นหาความช่วยเหลือเกี่ยวกับปัญหาใดๆ ที่คุณพบใน SO และไซต์อื่นๆ จึงเป็นเรื่องง่าย

person holtavolt    schedule 19.04.2011
comment
+1: สิ่งนี้รวมอยู่ใน C++0x ดังนั้นจึงควรพิสูจน์ได้ในอนาคต - person rubenvb; 19.04.2011

คุณสามารถค้นหาหนังสือ PDF ฟรี "C++-GUI-Programming-with-Qt-4-1st-ed.zip" และอ่านบทที่ 18 เกี่ยวกับมัลติเธรดใน Qt

คุณสมบัติการเขียนโปรแกรมพร้อมกันที่รองรับโดย Qt รวมถึง (ไม่จำกัดเพียง) ต่อไปนี้:

  • มูเท็กซ์
  • อ่านเขียนล็อค
  • สัญญาณ
  • รอสภาพ.
  • พื้นที่เก็บข้อมูลเฉพาะของเธรด

อย่างไรก็ตาม โปรดระวังข้อเสียต่อไปนี้กับ Qt:

  • บทลงโทษด้านประสิทธิภาพเทียบกับไลบรารีเธรดดั้งเดิม เธรด POSIX (pthreads) มีอยู่ใน Linux ตั้งแต่เคอร์เนล 2.4 และอาจใช้แทน ‹ process.h > ใน W32API ไม่ได้ในทุกสถานการณ์
  • การสื่อสารระหว่างเธรดใน Qt ถูกนำมาใช้กับโครงสร้าง SIGNAL และ SLOT สิ่งเหล่านี้ไม่ได้เป็นส่วนหนึ่งของภาษา C++ และถูกนำมาใช้เป็นมาโครซึ่งต้องใช้ตัวสร้างโค้ดที่เป็นกรรมสิทธิ์ของ Qt เพื่อคอมไพล์อย่างสมบูรณ์

หากคุณสามารถใช้ชีวิตตามข้อจำกัดข้างต้นได้ เพียงทำตามสูตรเหล่านี้สำหรับการใช้ QThread:

  1. #รวม ‹ QtCore >
  2. รับคลาสของคุณเองจาก QThread คุณต้องใช้ฟังก์ชันสาธารณะ run() ที่คืนค่าเป็นโมฆะเพื่อให้มีคำสั่งที่จะดำเนินการ
  3. สร้างอินสแตนซ์ของคลาสของคุณเองแล้วเรียก start() เพื่อเริ่มเธรดใหม่

รหัสตัวอย่าง:

#include <QtCore>

class MyThread : public QThread {
public:
    void run() {
        // do something
    }
};

int main(int argc, char** argv) {
    MyThread t1, t2;
    t1.start(); // default implementation from QThread::start() is fine
    t2.start(); // another thread
    t1.wait();  // wait for thread to finish
    t2.wait();
    return 0;
}
person user715213    schedule 19.04.2011

ตามหมายเหตุสำคัญใน c++14 การใช้ พร้อมกัน เธรด สามารถใช้ได้:

#include<thread>

class Example
{
  auto DoStuff() -> std::string
  { 
    return "Doing Stuff";
  }

  auto DoStuff2() -> std::string
  {
    return "Doing Stuff 2";
  }
};

int main() 
{
  Example EO;
  std::string(Example::*func_pointer)();
  func_pointer = &Example::DoStuff;
  std::future<string> thread_one = std::async(std::launch::async, func_pointer, &EO); //Launching upon declaring

  std::string(Example::*func_pointer_2)();
  func_pointer_2 = &Example::DoStuff2;
  std::future<string> thread_two = std::async(std::launch::deferred, func_pointer_2, &EO);
  thread_two.get(); //Launching upon calling
}

ทั้ง std::async (std::launch::async, std::launch::deferred) และ std::thread เข้ากันได้กับ Qt โดยสมบูรณ์ และในบางกรณีอาจทำงานได้ดีกว่าในการทำงานในสภาพแวดล้อมระบบปฏิบัติการที่แตกต่างกัน

สำหรับ การประมวลผลแบบขนาน โปรดดูที่ นี้.

person Babra Cunningham    schedule 03.01.2017