utas c++ - pemrosesan paralel

Saya bertanya-tanya bagaimana cara menjalankan dua proses dalam prosesor dual-core di c++.

Saya tahu utas (atau multi-threading) bukan fitur bawaan c++.

Ada dukungan threading di Qt, tapi saya tidak mengerti apa pun dari referensi mereka. :(

Nah, adakah yang tahu cara sederhana yang bisa dilakukan oleh pemula. Dukungan lintas platform (seperti Qt) akan sangat membantu karena saya menggunakan Linux.


person Kid Green    schedule 19.04.2011    source sumber


Jawaban (6)


Coba Multithreading di C+ +0x bagian 1: Memulai Thread sebagai 101. Jika kompiler Anda tidak memiliki C dukungan ++0x, lalu tetap menggunakan Boost.Thread

person dubnde    schedule 19.04.2011

Lihat Boost.Thread. Ini adalah lintas platform dan perpustakaan yang sangat bagus untuk digunakan dalam aplikasi C++ Anda.

Hal spesifik apa yang ingin Anda ketahui?

person murrekatt    schedule 19.04.2011

Pustaka thread POSIX (pthreads) mungkin merupakan pilihan terbaik Anda jika Anda hanya memerlukan pustaka threading sederhana, yang memiliki implementasi di Windows dan Linux.

Panduan dapat ditemukan mis. di sini. Implementasi pthreads Win32 dapat diunduh di sini.

Sunting: Tidak melihat Anda menggunakan Linux. Dalam hal ini saya tidak 100% yakin tetapi menurut saya perpustakaan tersebut mungkin sudah disertakan dengan instalasi GCC Anda.

person Rune Aamodt    schedule 19.04.2011

Saya sarankan menggunakan perpustakaan Boost Boost.Thread alih-alih. Ini akan membungkus spesifikasi platform Win32 dan Posix, dan memberi Anda sekumpulan objek threading dan sinkronisasi yang solid. Penggunaannya juga sangat berat, jadi mencari bantuan untuk masalah apa pun yang Anda temui di SO dan situs lain sangatlah mudah.

person holtavolt    schedule 19.04.2011
comment
+1: ini disertakan dalam C++0x, jadi ini juga harus tahan masa depan. - person rubenvb; 19.04.2011

Anda dapat mencari buku PDF gratis "C++-GUI-Programming-with-Qt-4-1st-ed.zip" dan membaca Bab 18 tentang Multi-threading di Qt.

Fitur pemrograman bersamaan yang didukung oleh Qt mencakup (tidak terbatas pada) hal berikut:

  • muteks
  • Baca Tulis Kunci
  • Tiang sinyal
  • Kondisi Tunggu
  • Penyimpanan Khusus Thread

Namun, waspadai trade-off berikut dengan Qt:

  • Penalti kinerja vs pustaka threading asli. Thread POSIX (pthreads) sudah asli Linux sejak kernel 2.4 dan mungkin tidak menggantikan ‹ process.h > di W32API dalam semua situasi.
  • Komunikasi antar thread di Qt diimplementasikan dengan konstruksi SIGNAL dan SLOT. Ini BUKAN bagian dari bahasa C++ dan diimplementasikan sebagai makro yang memerlukan generator kode berpemilik yang disediakan oleh Qt untuk dikompilasi sepenuhnya.

Jika Anda bisa hidup dengan batasan di atas, ikuti saja resep menggunakan QThread berikut:

  1. #termasuk ‹ QtCore >
  2. Turunkan kelas Anda sendiri dari QThread. Anda harus mengimplementasikan fungsi publik run() yang mengembalikan void berisi instruksi yang akan dieksekusi.
  3. Buat instance kelas Anda sendiri dan panggil start() untuk memulai thread baru.

Kode Contoh:

#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

Sebagai catatan penting di c++14, penggunaan bersamaan threading tersedia:

#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
}

Baik std::async (std::launch::async, std::launch::deferred) dan std::thread sepenuhnya kompatibel dengan Qt, dan dalam beberapa kasus mungkin lebih baik dalam bekerja di lingkungan OS yang berbeda.

Untuk pemrosesan paralel, lihat ini.

person Babra Cunningham    schedule 03.01.2017