SORU
14 ŞUBAT 2011, PAZARTESİ


Örnek / öğretici dışlama?

Çoklu yeniyim ve uyumu nasıl çalıştığını anlamaya çalışıyordu. Google'da bir sürü iş yaptım ve I found a decent tutorial, ama hala kilit işe yaramadı kendi programımı oluşturdum çünkü nasıl çalıştığına dair bazı şüpheler bıraktı.

Zaman uyumu olmayan sezgisel bir kesinlikle sözdizimi gerçekten kilit ne başka bir değişken olduğunda, zaman uyumu kilitlenmiş gibi görünüyor nerede pthread_mutex_lock( &mutex1 );,,. Bu sözdizimi bir dışlama kilitleme dışlama kilidi açılana kadar bir bölge kodu kilitler anlamına mı geliyor? Nasıl bir iş parçacığı bölge kilitli olduğunu biliyor musunuz? [GÜNCELLEME: iş Parçacığı bölge kilitli olduğunu biliyorumMemory Fencing ]. Ve böyle bir olay kritik bölüm adı olması gerekmiyor mu? [GÜNCELLEME: Kritik bölüm, nesneleri nesneleri daha hızlı uyumu daha sadece Windows, kullanılabilir ve bunu uygulayan tek iş parçacığı görünür. Aksi takdirde, önemli bir bölümü sadece kod alanı bir dışlama tarafından korunan ifade eder]

Kısacası, olabildiğince basit dışlama ile yardım eder misinizörnek programve olabildiğince basitaçıklamabu nasıl mantık? Bu yardımcı olacaktır eminimboldiğer yenilere.

CEVAP
1 Mart 2011, Salı


Açıklama ve kod için düzenlemeler çok hoş (daha açık/daha kısa/daha kolay/daha doğru yapmak için).
Burada dünya çapında yeni başlayanlar için bu kavramı açıklamak için benim mütevazı girişimi gidiyor: (blogumda colour coded version bir de)

Bir sürü insan sevdiklerini konuşmak yalnız telefon kulübesi (telefon yok) çalıştırın. Kabinin kapı kolu yakalamak için ilk kişi, telefonu kullanmak için izin verilir. Onda kalsın tutarak kolu kapıya kadar kullandığı telefon, aksi halde başkası yapar yakalayacak kolu, atın onu dışarı konuşmak karısı :) yok sıra sistemi gibi. Kişi Ara bitirir, kulübeden çıkar ve kapı kolu çıktığında, kapının kolu tutmak için bir sonraki kişi telefonu kullanmak için izin verilecektir.

Biriplik: Her kişi
zaman uyumu: kapı kolu
kilit: insan eli
kaynak: telefon

Herhangi bir iş parçacığı olan çalıştırmak için bazı kod satırlarını hangi değiştirilmemelidir tarafından başka bir iş parçacığı aynı anda (kullanarak telefonla konuşmak karısı), ilk elde bir kilit üzerinde bir dışlama (tutarak kapı kolu booth). Ancak o zaman bir iş parçacığı kod (telefon görüşmesi yapmayı) bu satırları çalıştırmak mümkün olacak.

İş parçacığı kod yürüttü sonra, başka bir iş parçacığı, zaman uyumu (diğer insanlar telefon kulübesi erişebilecek) kilitle böylece dışlama kilidi.

[Konsepti olan bir dışlama biraz saçma zaman dikkate gerçek dünya özel erişim, programlama dünyası sanırım başka bir yolu yoktu izin diğer konuları '' bir iş parçacığı zaten yürütülen bazı kod satırlarını. Vb özyinelemeli uyumu kavramları vardır, ama bu örnek sadece temel kavramı göstermek için yapılmıştı. Örnek kavramının net bir görüntü verir umarım.]

C 11 parçacığı:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex m;//you can use std::lock_guard if you want to be exception safe
int i = 0;

void makeACallFromPhoneBooth() 
{
    m.lock();//man gets a hold of the phone booth door and locks it. The other men wait outside
      //man happily talks to his wife from now....
      std::cout << i << " Hello Wife" << std::endl;
      i  ;//no other thread can access variable i until m.unlock() is called
      //...until now, with no interruption from other men
    m.unlock();//man leaves the phone booth
}

int main() 
{
    //This is the main crowd of people uninterested in making a phone call

    //man1 leaves the crowd to go to the phone booth
    std::thread man1(makeACallFromPhoneBooth);
    //Although man2 appears to start second, there's a good chance he might
    //reach the phone booth before man1
    std::thread man2(makeACallFromPhoneBooth);
    //And hey, man3 also joined the race to the booth
    std::thread man3(makeACallFromPhoneBooth);

    man1.join();//man1 finished his phone call and joins the crowd
    man2.join();//man2 finished his phone call and joins the crowd
    man3.join();//man3 finished his phone call and joins the crowd
    return 0;
}

Ve g -std=c 0x -pthread -o thread thread.cpp;./thread kullanarak çalıştırmak

TBB: İhtiyacınız olacak TBB çalıştırmak için aşağıdaki programı ama niyet gönderme TBB kodu olduğunu anlamak sırası kilitleme ve kilidini sadece bakarak basit bir kod (olabilirdi gösterilen kapsamlı kilitleyerek kullanarak kazanmak ve yayın - which also is exception safe -ama bu daha net).

#include <iostream>
#include "/tbb/mutex.h"
#include "/tbb/tbb_thread.h"
using namespace tbb;

typedef mutex myMutex;
static myMutex sm;
int i = 0;

void someFunction() 
{ 
      myMutex::scoped_lock lock;//create a lock
      lock.acquire(sm);//Method acquire waits until it can acquire a lock on the mutex
         //***only one thread can access the lines from here...***
           i;//incrementing i is safe (only one thread can execute the code in this scope) because the mutex locked above protects all lines of code until the lock release.
         sleep(1);//simply creating a delay to show that no other thread can increment i until release() is executed
         std::cout<<"In someFunction "<<i<<"\n";
         //***...to here***
      lock.release();//releases the lock (duh!)      
}

int main()
{
   tbb_thread my_thread1(someFunction);//create a thread which executes 'someFunction'
   tbb_thread my_thread2(someFunction);
   tbb_thread my_thread3(someFunction);

   my_thread1.join();//This command causes the main thread (which is the 'calling-thread' in this case) to wait until thread1 completes its task.
   my_thread2.join();
   my_thread3.join();
}

tbb_thread.h önerilmiyor unutmayın. Yedek here gösterilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Arun Kumar

    Arun Kumar

    18 Mart 2010
  • BDGcustoms

    BDGcustoms

    24 NİSAN 2011
  • SegaAmerica

    SegaAmerica

    5 Mart 2008