multithreading c with examples
C ++ 'da Çoklu Okumaya Kısa Bir Giriş.
Bu eğitimde, C ++ 'da çoklu okumaya genel bir bakış alacağız.
Öyleyse konu nedir? Bir iş parçacığı, belirli bir sürecin çalışan bir birimidir. Çoklu programlama işletim sistemlerinde, farklı işlemler aynı anda yürütülmektedir.
Benzer şekilde, aynı süreç örneklerini aynı anda yürütmek isteyebiliriz. Bu durumda her işlem eşgörünümü, evre adı verilen bir yürütme birimine atanır. Çok iş parçacıklı bir sistemde, çok sayıda iş parçacığı aynı anda birbirinden bağımsız olarak çalışır.
=> C ++ Yeni Başlayanlar Kılavuzuna Bir Göz Atın.
C ++ 11'den önce POSIX iş parçacığı desteğimiz vardı. Ancak bu özelliğin, yalnızca Linux veya UNIX işletim sisteminde çalıştığı için ciddi taşınabilirlik sorunları vardı. Böylece C ++ 11'den itibaren tek bir sınıfımız var std :: iş parçacığı iş parçacığı için tüm işlevselliği tanımlar. Sınıflar ve işlevler başlık dosyasında tanımlanmıştır.
Ne öğreneceksin:
Çalışma
Std :: thread kullanarak yeni bir evre nesnesi yaratmamız ve ona çağrılabilir bir nesne iletmemiz yeterlidir. Çağrılabilir, iş parçacığı çalışırken yürütmek istediğimiz yürütülebilir bir koddur. Bu yüzden, ne zaman yeni bir evre istediğimizde, sadece bir std :: thread nesnesi yaratırız ve yapıcısına argüman olarak çağrılabilir olanı iletiriz.
Std :: thread nesnesi yaratıldığında, yeni bir evre başlatılır ve callable tarafından sağlanan kod çalıştırılır.
Evre nesnesine sağlanacak bir çağrılabilirliği nasıl tanımlayabileceğimizi görelim.
Bir çağrılabilir üç şekilde tanımlanabilir.
# 1) İşlev Nesnesini Kullanma
Bir işlev nesnesini thread nesnesinde çağrılabilir olarak kullanabiliriz. İşlev nesnesini kullanmak için bir sınıfa ihtiyacımız var ve bu sınıfta operatörü () aşırı yüklüyoruz. Bu aşırı yüklenmiş işlev, iş parçacığı oluşturulduğunda yürütülecek kodu içerir.
/ / Define the class for function object class functioObject_class { // Overload () operator void operator()(params) { // code to be executed } }; // Create thread object
std::thread thread_object(functioObject_class (), params)
İplik nesnesinin nasıl tanımlandığına dikkat edin. Thread nesnesinin kurucusunun ilk parametresi olarak, aşırı yüklenmiş fonksiyonu sağlıyoruz ve ardından ikinci argüman olarak argümanlarını (params) belirtiyoruz.
# 2) İşlev İşaretçisini Kullanma
Fonksiyon işaretçisi kullanılarak çağrılabilir bir aşağıdaki şekilde tanımlanabilir.
void funct_call(params) //code to be executed }
Bu işlevi tanımladıktan sonra, bu işlevi çağırılabilir olarak aşağıdaki şekilde bir evre nesnesi oluşturabiliriz.
std::thread thread_obj(funct_call, params);
İşleve aktarılan argümanların (parametreler), iş parçacığı nesnesindeki işlev adından sonra sağlandığına dikkat edin.
# 3) Bir Lambda İfadesi Kullanma
Ayrıca lambda ifadesi olarak çağrılabilir bir ifadeye sahip olabilir ve onu yürütme için evre nesnesine geçirebiliriz. Aynı kod parçacığı aşağıda gösterilmiştir.
// Define a lambda expression auto f = ()(params) { // code for execution };
std::thread thread_object(f, params);
Yukarıdaki kodda, f lambda ifadesini tanımladık ve daha sonra bunu birinci argüman olarak thread nesnesi yapıcısına ve ardından ikinci argüman olarak parametrelerini (params) geçirdik.
std::thread join method
Bazı durumlarda, başka bir eyleme başlamadan önce şu anda yürütülen iş parçacığının bitmesini isteyebiliriz.
Klasik bir örnek, GUI uygulamasını açtığımız zamandır. Uygulamayı açtığımız anda, GUI'yi yüklemek ve başlatmak için bir iş parçacığı başlatılır ve GUI'nin düzgün çalışmasını sağlamak için yükleme ve başlatma doğru şekilde yapılmadıkça herhangi bir işlem gerçekleştiremeyiz.
varsayılan ağ geçidi mevcut değil pencereler 7
Sınıf std :: thread, geçerli evrenin (* bu ile gösterilen) diğer herhangi bir eylem yapılmadan önce bitmesini sağlayan bir join () yöntemi sağlar.
Aşağıdaki örneği alın,
int main() { std::thread t1(callable_code); ….. t1.join(); ….. }
Yukarıdaki örnekte, ana işlev t1 iş parçacığı bitene kadar devam etmek için beklemek zorunda kalacaktır. Genel olarak, iş parçacığının birleştirme işlevi, evre çağrısı yürütmeyi bitirene kadar diğer eylemleri / işlevleri engeller.
İplik Örneği
Aşağıda gösterilen programda iş parçacığının oluşturulması ve yürütülmesi için eksiksiz bir kodlama örneği sunuyoruz.
#include #include using namespace std; // function to be used in callable void func_dummy(int N) { for (int i = 0; i Çıktı:
Konu 1 :: çağrılabilir => işlev işaretçisi
Konu 1 :: çağrılabilir => işlev işaretçisi
Thread 3 :: callable => lambda ifadesi
Thread 3 :: callable => lambda ifadesi
Thread 2 :: callable => fonksiyon nesnesi
Thread 2 :: callable => fonksiyon nesnesi
Yukarıdaki örnekte, üç farklı çağrılabilir, yani işlev işaretçisi, nesne ve lambda ifadesi kullanarak üç iş parçacığı oluşturduk. Her iş parçacığından 2 örnek oluşturup başlatıyoruz. Çıktıda gösterildiği gibi, üç iplik aynı anda birbirinden bağımsız olarak çalışır.
Önerilen okuma = >> Diş Testi Kılavuzu
Sonuç
Bu eğitimde, C ++ 'da çok iş parçacıklı kavramları açık bir örnekle gördük. Sonraki eğitimlerimizde, sağlam ve verimli programlar yazmamıza yardımcı olacak daha fazla C ++ konusu öğreneceğiz.
=> Kolay C ++ Eğitim Serisini Okuyun.
Önerilen Kaynaklar
- Uygulamalı Örneklerle Python Ana İşlev Eğitimi
- Örneklerle Python DateTime Eğitimi
- Örneklerle Unix'te Kesme Komutu
- Unix Cat Komut Sözdizimi, Örneklerle Seçenekler
- MongoDB'de İmleç Kullanımı Örneklerle
- Örneklerle Unix'te Ls Komutu
- MongoDB Sort () Yöntemi Örneklerle
- Basit Örneklerle Unix'te Grep Komutu