Bedingungsvariablen versus Tasks zur Synchronisation von Threads

Inhaltsverzeichnis[Anzeigen]

 

Werden Promise und Future für die Synchronization von Threads verwendet, haben sie sehr viel gemein mit Bedingungsvariablen. Meist sind Tasks die bessere Wahl.

Synchronisation von Threads

Zur leichtern Übersicht, erst Mal die Fakten. Die Tabelle stellt die Bedingungsvariablen den Task in der Form von Promise und Futures gegenüber.

ConditionVariableVersusTask

Der Vorteil einer Bedingungsvariable gegenüber einem Promise und Future  Paar ist es, dass mit ihm mehrmalige Synchronisationen möglich ist. Hingegen kann ein Promise seine Benachrichtigung nur einmalig in den gemeinsamen Datenkanal schieben. Daher müssen eventuell mehrere Promise und Future Paare verwendet werden, um die Funktionalität einer Bedingungsvariable darzustellen. Wird eine Bedingungsvariable nur einmal verwendet, dann ist sie deutlich schwieriger richtig zu benutzen als ein Promise und Future Paar. So benötigen die beiden keine gemeinsame Variable und daher keine Locks, sie sind nicht anfällig für spurious wakeups oder lost wakeups. Darüber hinaus können sie mit Ausnahmen umgehen. Es spricht sehr viel dafür, Tasks Bedingungsvariablen vorzuziehen.

Wie schaut die Synchronisation mit Tasks aus?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <future>
#include <iostream>
#include <utility>


void doTheWork(){
  std::cout << "Processing shared data." << std::endl;
}

void waitingForWork(std::future<void>&& fut){

    std::cout << "Worker: Waiting for work." << std::endl;
    fut.wait();
    doTheWork();
    std::cout << "Work done." << std::endl;

}

void setDataReady(std::promise<void>&& prom){

    std::cout << "Sender: Data is ready."  << std::endl;
    prom.set_value();

}

int main(){

  std::cout << std::endl;

  std::promise<void> sendReady;
  auto fut= sendReady.get_future();

  std::thread t1(waitingForWork,std::move(fut));
  std::thread t2(setDataReady,std::move(sendReady));

  t1.join();
  t2.join();

  std::cout << std::endl;
  
}

 

Relativ unspektakulär.

Mit Hilfe des Promise sendReady (Zeile 30) wird der Future fut (Zeile 32) erzeugt. In diesem Fall signalisiert der Promise durch seinen Rückgabewert void in std::promise<void> sendReady, dass er nur eine Benachrichtigung schickt. Beide Kommunikationsendpunkte werden in den Thread t1 bzw. t2 (Zeile 33 und 34) verschoben. Nun wartet der Future mit sein Aufruf fut.wait() (Zeile 13) darauf, dass ihm der Promise mit prom.set_value() (Zeile 22) seine Benachrichtigung schickt.

Sowohl die Struktur des Programms als auch die Ausgabe des Programms entspricht dem Beispielprogramm des Artikel Bedingungsvariablen.

promiseFutureSynchronize

Wie geht's weiter?

Auf die Suche in die Breite kommt die Suche in die Tiefe. Diesem Motto folgend, geht es in den nächsten Artikeln um das C++-Speichermodell. Auch wenn die wenigsten Entwickler jemals die Feature des C++-Speichermodells einsetzen werden, wollen und sollten, so hilft das C++-Speichermodell doch, ein tieferes Verständnis für die Herausforderung des Multithreading Programmierung zu entwickeln. 

 

Hintergrundinformation

std::promise   
    Die Details lassen sich schön auf cppreference nachlesen.
std::future   
    Die Details lassen sich schön auf cppreference nachlesen.

 

 

 

 

 

 

 

 

 

 

title page smalltitle page small Go to Leanpub/cpplibrary "What every professional C++ programmer should know about the C++ standard library".   Hole dir dein E-Book. Unterstütze meinen Blog.


 

Kommentare   

0 #1 Summoners War Hack 2016-05-19 05:03
I just could not go away your web site prior to suggesting
that I actually enjoyed the usual information an individual supply to your guests?

Is gonna be back frequently to check up on new posts
Zitieren
0 #2 zbiornika z betonu 2016-11-14 10:29
Hey There. I discovered your weblog the usage of msn. This is an extremely
well written article. I will be sure to bookmark it and
return to read more of your useful information. Thank you for the
post. I'll certainly comeback.
Zitieren
0 #3 Growtopia iOS Hack 2016-12-19 00:41
Fantastic beat ! I would like to apprentice at the samke time as you amend your site,
how can i subscribe for a wdblog web site? The account aided me a aceptable deal.
I had been tiny bit acquainted of this your broadcast provided shiny clear idea
Zitieren
0 #4 Growtopia Hack Tool 2016-12-19 16:24
Thatt is a really good tip particularly to thise fresh to the blogosphere.
Brief but very accurate information… Appreciate your sharing this one.
A must red post!
Zitieren
0 #5 FIFA 17 Hack Online 2016-12-23 14:27
We are a group of volunteers and opening a brand new
scheme in our community. Your sitye offered us with useful info to work
on. You have done a formidable jjob and our entirfe community will likely
be grateful to you.
Zitieren
0 #6 Hack Growtopia 2016-12-24 01:00
Admiring the time and effort you put into your blog
and detailed information you provide. It's awesome to come across a
blog every once in a while that isn't the same outdated rehashed information. Geat read!
I've saved yyour site and I'm adfing your RSS feeds to my
Google account.
Zitieren
0 #7 Free Growtopia Gems 2016-12-24 02:57
Hello! I've been following your weblog for a while now and finally got the bravery to go ahead and give you a shout out from Austin Tx!

Just wanted to tell you keep up the fantastic work!
Zitieren
0 #8 Growtopia iOS Hack 2016-12-26 00:09
I don't even know how I ended upp here, but I thought this post was
great. I do not know who you aare but definitely you are going to a famous blogger if you aren't already ;) Cheers!
Zitieren

Kommentar schreiben


Abonniere den Newsletter (+ pdf Päckchen)

Beiträge-Archiv

Sourcecode

Neuste Kommentare