Dapatkah seseorang memposting contoh sederhana memulai dua utas (Berorientasi Objek) dalam C ++.
Saya mencari objek ulir C ++ aktual yang dapat saya gunakan untuk menjalankan metode (atau yang serupa) sebagai lawan memanggil pustaka thread gaya-C.
Saya mengabaikan permintaan khusus OS dengan harapan bahwa siapa pun yang menjawab akan membalas dengan pustaka lintas platform untuk digunakan. Saya hanya membuat itu eksplisit sekarang.
c++
multithreading
Zak
sumber
sumber
Jawaban:
Buat fungsi yang Anda ingin utas dieksekusi, misalnya:
Sekarang buat
thread
objek yang pada akhirnya akan memanggil fungsi di atas seperti:(Anda perlu
#include <thread>
mengaksesstd::thread
kelas)Argumen konstruktor adalah fungsi yang akan dijalankan thread, diikuti oleh parameter fungsi. Utas secara otomatis dimulai setelah konstruksi.
Jika nanti Anda ingin menunggu utas selesai menjalankan fungsi, hubungi:
(Bergabung berarti bahwa utas yang memanggil utas baru akan menunggu utas baru untuk menyelesaikan eksekusi, sebelum itu akan melanjutkan eksekusinya sendiri).
Kode
Informasi lebih lanjut tentang std :: utas di sini
-std=c++0x -pthread
.sumber
-std=c++0x
(bukan-std=c++0x
)" Saya percaya yang kedua "c ++ 0x" sebaliknya harus "c ++ 11", tetapi itu tidak mungkin untuk diubah karena hasil edit terlalu kecil.task1
. Jadi pointer fungsi juga dilambangkan dengantask1
. Tetapi terima kasih telah mengemukakan ini karena saya yakin saya salah dan ini setara dengan&task1
, jadi tidak masalah bentuk mana yang Anda pilih untuk ditulis (jika demikian, saya rasa pointer ke pointer dari fungsi ini&&task1
- itu akan menjadi buruk ). Pertanyaan yang relevan .Nah, secara teknis setiap objek seperti itu akan dibangun di atas pustaka thread gaya-C karena C ++ baru saja menentukan
std::thread
model stok dalam c ++ 0x, yang baru saja dipakukan dan belum diimplementasikan. Masalahnya agak sistemik, secara teknis model memori c ++ yang ada tidak cukup ketat untuk memungkinkan semantik yang didefinisikan dengan baik untuk semua kasus 'terjadi sebelum'. Hans Boehm menulis makalah tentang topik beberapa waktu lalu dan berperan dalam memalu standar c ++ 0x pada topik tersebut.http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html
Yang mengatakan ada beberapa cross-platform thread C ++ perpustakaan yang berfungsi dengan baik dalam praktek. Blok pembangun utas Intel berisi objek tbb :: thread yang mendekati standar c ++ 0x dan Boost memiliki pustaka boost :: thread yang melakukan hal yang sama.
http://www.threadingbuildingblocks.org/
http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html
Menggunakan boost :: utas Anda akan mendapatkan sesuatu seperti:
sumber
Ada juga perpustakaan POSIX untuk sistem operasi POSIX. Periksa kompatibilitas
kompilasi dengan -lpthread
http://en.wikipedia.org/wiki/POSIX_Threads
sumber
sumber
Saat mencari contoh kelas C ++ yang memanggil salah satu metode turunannya sendiri di utas baru, pertanyaan ini muncul, tetapi kami tidak dapat menggunakan jawaban ini dengan cara itu. Berikut ini contoh yang melakukan itu:
Hr
Class.cpp
Perhatikan bahwa contoh ini tidak masuk ke mutex atau mengunci.
sumber
Kecuali ada yang menginginkan fungsi terpisah dalam namespac global, kita bisa menggunakan fungsi lambda untuk membuat utas.
Salah satu keuntungan utama membuat utas menggunakan lambda adalah kita tidak perlu memberikan parameter lokal sebagai daftar argumen. Kita dapat menggunakan daftar tangkap untuk hal yang sama dan properti penutupan lambda akan menjaga siklus hidup.
Berikut ini contoh kode
Sejauh ini, saya telah menemukan C ++ lambdas menjadi cara terbaik untuk membuat utas terutama untuk fungsi utas yang lebih sederhana
sumber
Ini sangat tergantung pada perpustakaan yang Anda putuskan untuk digunakan. Misalnya, jika Anda menggunakan pustaka wxWidgets, pembuatan utas akan terlihat seperti ini:
Jika utas utama Anda memanggil metode CreateThread, Anda akan membuat utas baru yang akan mulai mengeksekusi kode dalam metode "Entri" Anda. Anda harus menyimpan referensi ke utas dalam banyak kasus untuk bergabung atau menghentikannya. Info lebih lanjut di sini: dokumentasi wxThread
sumber