Heim > Backend-Entwicklung > C++ > Hauptteil

C++ Concurrent Programming: Wie gehe ich mit der Kommunikation zwischen Threads um?

WBOY
Freigeben: 2024-05-04 12:45:02
Original
317 Leute haben es durchsucht

Zu den Methoden für die Kommunikation zwischen Threads in C++ gehören: gemeinsam genutzter Speicher, Synchronisierungsmechanismen (Mutex-Sperren, Bedingungsvariablen), Pipes und Nachrichtenwarteschlangen. Verwenden Sie beispielsweise eine Mutex-Sperre, um einen gemeinsam genutzten Zähler zu schützen: Deklarieren Sie eine Mutex-Sperre (m) und eine gemeinsam genutzte Variable (Zähler). Stellen Sie sicher, dass jeweils nur ein Thread den Zähler aktualisiert um Rennbedingungen zu verhindern.

C++ Concurrent Programming: Wie gehe ich mit der Kommunikation zwischen Threads um?

C++ Concurrent Programming: Wie gehe ich mit der Kommunikation zwischen Threads um?

In einer Multithread-Anwendung müssen Threads in der Lage sein, miteinander zu kommunizieren, um Aufgaben zu koordinieren und Daten auszutauschen. C++ bietet eine Vielzahl von Mechanismen zur Implementierung der Kommunikation zwischen Threads, darunter:

Gemeinsamer Speicher

Mithilfe von Shared Memory können mehrere Threads auf denselben Speicherbereich zugreifen. Dies ist ein Ansatz mit geringem Overhead, es muss jedoch darauf geachtet werden, Rennbedingungen zu vermeiden.

int shared_data = 0;

void thread_1() {
  shared_data++; // 可能会被其他线程同时访问
}

void thread_2() {
  shared_data++; // 可能会同时导致不正确的结果
}
Nach dem Login kopieren

Synchronisationsmechanismus

Der Synchronisationsmechanismus kann verwendet werden, um Threads beim Zugriff auf gemeinsam genutzte Ressourcen zu koordinieren.

Mutex (Mutex)

Mutex bietet sich gegenseitig ausschließenden Zugriff und stellt sicher, dass jeweils nur ein Thread auf gemeinsam genutzte Ressourcen zugreifen kann.

std::mutex m;

void thread_1() {
  std::lock_guard<std::mutex> l(m); // 获取互斥锁
  // 访问共享资源
}

void thread_2() {
  std::lock_guard<std::mutex> l(m); // 获取互斥锁
  // 访问共享资源
}
Nach dem Login kopieren

Bedingungsvariable

Bedingungsvariablen ermöglichen es Threads, auf die Erfüllung bestimmter Bedingungen zu warten.

std::condition_variable cv;
std::mutex m;

void producer() {
  std::lock_guard<std::mutex> l(m); // 获取互斥锁
  while (!condition) {
    // 等待条件满足
    cv.wait(l);
  }
  // 生产数据
}

void consumer() {
  std::lock_guard<std::mutex> l(m); // 获取互斥锁
  condition = true;
  cv.notify_all(); // 唤醒所有等待线程
}
Nach dem Login kopieren

Pipe

Pipe ist ein unidirektionaler Kommunikationsmechanismus, der zum Übertragen von Daten zwischen zwei Threads verwendet wird.

std::pipe pipe;

void writer() {
  std::string message = "hello";
  std::write(pipe[1], message.c_str(), message.length());
}

void reader() {
  std::string message;
  std::read(pipe[0], message.data(), message.size());
}
Nach dem Login kopieren

Message Queue

Message Queue bietet einen asynchronen Nachrichtenübermittlungsmechanismus.

key_t key = ftok("message_queue", 'a');

int message_queue = msgget(key, IPC_CREAT | 0666);

void sender() {
  Message msg;
  msg.mtext = "hello";
  msgsnd(message_queue, &msg, sizeof(msg.mtext), IPC_NOWAIT);
}

void receiver() {
  Message msg;
  msgrcv(message_queue, &msg, sizeof(msg.mtext), 0, 0);
}
Nach dem Login kopieren

Praktischer Fall: Verwenden eines Mutex zum Schutz eines gemeinsam genutzten Zählers

Angenommen, wir haben einen gemeinsam genutzten Zähler, der von mehreren Threads gleichzeitig aktualisiert werden muss. Wir können diesen Zähler mit einem Mutex schützen:

std::mutex m;
int counter = 0;

void thread_1() {
  for (int i = 0; i < 1000000; i++) {
    std::lock_guard<std::mutex> l(m);
    counter++;
  }
}

void thread_2() {
  for (int i = 0; i < 1000000; i++) {
    std::lock_guard<std::mutex> l(m);
    counter--;
  }
}
Nach dem Login kopieren

Dadurch wird sichergestellt, dass jeweils nur ein Thread den Zähler aktualisieren kann, wodurch Race Conditions verhindert werden.

Das obige ist der detaillierte Inhalt vonC++ Concurrent Programming: Wie gehe ich mit der Kommunikation zwischen Threads um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!