2016-03-30 14 views
0

Bir bağlantı noktasını dinleyen bir sunucum var ve birkaç tane ayrık konu oluşturuyorum.C++ iş parçacığı: diğer uzun ömürlü iş parçacığına nasıl ileti gönderilir?

Sadece sunucu kendiliğinden sonsuza kadar çalışmayacaktır, aynı zamanda ayrılan parçacıklar da sonsuza kadar çalışacaktır. Ben çoklu kullanım için yeni beri

//pseudocode 
void t1_func() 
{ 
    for(;;) 
    { 
    if(notified from server) 
     dosomething(); 
    } 
} 
thread t1(t1_func); 
thread t2(...); 
for(;;) 
{ 
    // read from accepted socket 
    string msg = socket.read_some(...); 
    //notify thread 1 and thread 2; 
} 

, ben müstakil Konuda sunucuda nofity ve check the nofity böyle nasıl uygulanacağı bilmiyorum.

Herhangi bir yararlı ipucu takdir edilecektir.

+0

'std :: condition_variable'. –

cevap

0

Bunu yapmanın en kolay yolu std::condition_variable. std::condition_variable, başka bir iş parçacığı üzerinde notify_one veya notify_all numaralı çağrıları bekleyene kadar bekleyecek ve ancak sonra uyanacak.

std::condition_variable t1_cond; 
void t1_func() 
{ 
    //wait requires a std::unique_lock 
    std::mutex mtx; 
    std::unique_lock<std::mutex> lock{ mtx }; 
    while(true) 
    { 
     t1_cond.wait(lock); 
     doSomething(); 
    } 
} 

wait yöntem std::unique_lock alır ama kilit iplik bildirmek için paylaşılabilir zorunda değildir:

İşte t1_func hayata kullanarak koşul değişkenleri olduğunu. Eğer belli bir süre sonra iplik uyandırma olmasını istiyorsanız

t1_cond.notify_one(); 

Eğer wait_for kullanmak yerine olabilir: Eğer ana iş parçacığı gelen işçi iş parçacığı uyanmak istiyorum ne zaman böyle notify_one veya notify_all çağırır wait.

+0

'' call '' (işçi) doSomething() 'adlı işçiyi çağırdıktan sonra, çalışan iş parçacığı hala bir sonraki bildirimi bekleyebilir mi? – chenzhongpu

+0

@ChenZhongPu Evet, her aradığında bekle() 'bildirilene kadar bekleyecektir. – phantom

İlgili konular