Rumah pembangunan bahagian belakang C++ Pengaturcaraan Serentak C++: Bagaimana untuk menggunakan CPU berbilang teras untuk mencapai konkurensi?

Pengaturcaraan Serentak C++: Bagaimana untuk menggunakan CPU berbilang teras untuk mencapai konkurensi?

May 01, 2024 am 11:51 AM
c++ Pengaturcaraan serentak akses serentak

C++ pengaturcaraan serentak memanfaatkan sepenuhnya CPU berbilang teras dengan mencipta benang, mutex dan pembolehubah keadaan. Mencipta benang membolehkan tugasan dilaksanakan secara selari. Mutex bertindak sebagai kunci untuk memastikan data yang dikongsi tidak diakses oleh berbilang benang secara serentak, dengan itu mengelakkan rasuah data. Pembolehubah keadaan digunakan untuk memberitahu urutan bahawa syarat tertentu telah dipenuhi, dan digunakan dengan kunci mutex untuk menghalang utas daripada terus melaksanakan sehingga syarat dipenuhi.

Pengaturcaraan Serentak C++: Bagaimana untuk menggunakan CPU berbilang teras untuk mencapai konkurensi?

Pengaturcaraan Serentak dalam C++: Membuka kunci CPU Berbilang Teras

Prakata

CPU moden selalunya mempunyai berbilang teras, dan dengan menggunakan sepenuhnya kod pemotongan ini, kami boleh meningkatkan kecekapan kod ini dengan ketara. C++ menyediakan pelbagai alat pengaturcaraan serentak yang membolehkan pengaturcara membuat aplikasi dengan mudah yang boleh melaksanakan pelbagai tugas secara serentak.

Mencipta Benang

Mencipta Benang ialah blok binaan asas yang mewakili konkurensi. Dalam C++, anda boleh mencipta urutan baharu menggunakan kelas std::thread. Ia menerima sebagai hujah objek boleh dipanggil yang menentukan tugas yang akan dilakukan dalam benang berasingan. std::thread 类创建新线程。它接受一个可调用对象作为参数,该对象指定在单独的线程中执行的任务。

#include <iostream>
#include <thread>

void hello_world() {
  std::cout << "Hello, world!" << std::endl;
}

int main() {
  std::thread thread1(hello_world);
  thread1.join();

  return 0;
}
Salin selepas log masuk

在上面的代码中,hello_world() 函数是一个可调用对象,它只需向控制台打印一条消息。std::thread 构造函数创建一个新线程并执行可调用对象。thread1.join() 阻塞主线程,直到新线程完成。

互斥锁

线程并发访问共享数据时,互斥锁非常重要。它们充当锁,防止多个线程同时访问关键部分,从而避免数据损坏。在 C++ 中,可以使用 std::mutex 类创建互斥锁。

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

std::mutex m;  // 全局互斥锁

void increment(int& counter) {
  std::lock_guard<std::mutex> lock(m);  // 获取互斥锁
  ++counter;
}

int main() {
  int counter = 0;

  std::thread thread1(increment, std::ref(counter));
  std::thread thread2(increment, std::ref(counter));

  thread1.join();
  thread2.join();

  std::cout << "Final counter value: " << counter << std::endl;

  return 0;
}
Salin selepas log masuk

在这个示例中,increment() 函数对共享变量 counter 进行递增。我们使用 std::lock_guard 来获取互斥锁,确保只有一个线程可以同时执行关键部分。这种机制确保两个线程不会同时递增 counter,从而避免数据竞争。

条件变量

条件变量用于通知线程特定条件已满足。它们与互斥锁一起使用,以确保线程在满足条件之前不会继续执行。在 C++ 中,可以使用 std::condition_variable 类创建条件变量。

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

std::mutex m;  // 全局互斥锁
std::condition_variable cv;  // 全局条件变量
bool ready = false;  // 共享布尔标志

void producer() {
  std::lock_guard<std::mutex> lock(m);  // 获取互斥锁
  ready = true;                       // 设置共享标志为 true
  cv.notify_one();                   // 通知一个等待的线程
}

void consumer() {
  std::unique_lock<std::mutex> lock(m);  // 获取互斥锁(并锁定它)
  while (!ready)                        // 等待共享标志为 true
    cv.wait(lock);                     // 释放互斥锁并等待
}

int main() {
  std::thread producer_thread(producer);
  std::thread consumer_thread(consumer);

  producer_thread.join();
  consumer_thread.join();

  return 0;
}
Salin selepas log masuk

在此示例中,我们使用条件变量来协调生产者和消费者线程之间的交互。producer() 函数设置共享标志 ready 为 true 并通知消费者线程。consumer()rrreee

Dalam kod di atas, fungsi hello_world() ialah objek boleh panggil yang hanya mencetak mesej ke konsol. Pembina std::thread mencipta utas baharu dan melaksanakan objek boleh panggil. thread1.join() menyekat urutan utama sehingga urutan baharu selesai. 🎜🎜🎜Mutex lock🎜🎜🎜Mutex lock adalah sangat penting apabila urutan mengakses data kongsi secara serentak. Mereka bertindak sebagai kunci untuk menghalang berbilang benang daripada mengakses bahagian kritikal secara serentak, dengan itu mengelakkan rasuah data. Dalam C++, anda boleh mencipta kunci mutex menggunakan kelas std::mutex. 🎜rrreee🎜Dalam contoh ini, fungsi increment() menambah pembolehubah kongsi counter. Kami menggunakan std::lock_guard untuk mendapatkan kunci mutex, memastikan hanya satu utas boleh melaksanakan bahagian kritikal pada masa yang sama. Mekanisme ini memastikan bahawa dua urutan tidak menambah counter pada masa yang sama, sekali gus mengelakkan perlumbaan data. 🎜🎜🎜Pembolehubah bersyarat🎜🎜🎜Pembolehubah bersyarat digunakan untuk memberitahu urutan bahawa syarat tertentu telah dipenuhi. Ia digunakan dengan kunci mutex untuk memastikan bahawa benang tidak meneruskan pelaksanaan sehingga syarat dipenuhi. Dalam C++, pembolehubah keadaan boleh dibuat menggunakan kelas std::condition_variable. 🎜rrreee🎜Dalam contoh ini, kami menggunakan pembolehubah keadaan untuk menyelaraskan interaksi antara rangkaian pengeluar dan pengguna. Fungsi producer() menetapkan bendera kongsi sedia kepada benar dan memberitahu urutan pengguna. Fungsi consumer() menunggu bendera kongsi menjadi benar dengan menunggu pada pembolehubah syarat sebelum meneruskan pelaksanaan. 🎜

Atas ialah kandungan terperinci Pengaturcaraan Serentak C++: Bagaimana untuk menggunakan CPU berbilang teras untuk mencapai konkurensi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk melaksanakan Corak Reka Bentuk Strategi dalam C++? Bagaimana untuk melaksanakan Corak Reka Bentuk Strategi dalam C++? Jun 06, 2024 pm 04:16 PM

Langkah-langkah untuk melaksanakan corak strategi dalam C++ adalah seperti berikut: tentukan antara muka strategi dan isytiharkan kaedah yang perlu dilaksanakan. Buat kelas strategi khusus, laksanakan antara muka masing-masing dan sediakan algoritma yang berbeza. Gunakan kelas konteks untuk memegang rujukan kepada kelas strategi konkrit dan melaksanakan operasi melaluinya.

Persamaan dan Perbezaan antara Golang dan C++ Persamaan dan Perbezaan antara Golang dan C++ Jun 05, 2024 pm 06:12 PM

Golang dan C++ masing-masing adalah sampah yang dikumpul dan bahasa pengaturcaraan pengurusan memori manual, dengan sistem sintaks dan jenis yang berbeza. Golang melaksanakan pengaturcaraan serentak melalui Goroutine, dan C++ melaksanakannya melalui benang. Pengurusan memori Golang adalah mudah, dan C++ mempunyai prestasi yang lebih kukuh. Dalam kes praktikal, kod Golang adalah lebih ringkas dan C++ mempunyai kelebihan prestasi yang jelas.

Bagaimana untuk melaksanakan pengendalian pengecualian bersarang dalam C++? Bagaimana untuk melaksanakan pengendalian pengecualian bersarang dalam C++? Jun 05, 2024 pm 09:15 PM

Pengendalian pengecualian bersarang dilaksanakan dalam C++ melalui blok try-catch bersarang, membenarkan pengecualian baharu dibangkitkan dalam pengendali pengecualian. Langkah-langkah cuba-tangkap bersarang adalah seperti berikut: 1. Blok cuba-tangkap luar mengendalikan semua pengecualian, termasuk yang dilemparkan oleh pengendali pengecualian dalam. 2. Blok cuba-tangkap dalam mengendalikan jenis pengecualian tertentu, dan jika pengecualian luar skop berlaku, kawalan diberikan kepada pengendali pengecualian luaran.

Cara menyelesaikan masalah pelayan yang sibuk untuk DeepSeek Cara menyelesaikan masalah pelayan yang sibuk untuk DeepSeek Mar 12, 2025 pm 01:39 PM

DeepSeek: Bagaimana menangani AI yang popular yang sesak dengan pelayan? Sebagai AI panas pada tahun 2025, DeepSeek adalah sumber percuma dan terbuka dan mempunyai prestasi yang setanding dengan versi rasmi OpenAIO1, yang menunjukkan popularitinya. Walau bagaimanapun, kesesuaian yang tinggi juga membawa masalah kesibukan pelayan. Artikel ini akan menganalisis sebab -sebab dan menyediakan strategi mengatasi. DeepSeek Web Version Masuk: https://www.deepseek.com/deepseek Server Sibuk Sebab: Akses serentak yang tinggi: Ciri -ciri percuma dan berkuasa DeepSeek menarik sejumlah besar pengguna untuk digunakan pada masa yang sama, mengakibatkan beban pelayan yang berlebihan. Serangan Siber: Dilaporkan bahawa DeepSeek mempunyai kesan terhadap industri kewangan AS.

Bagaimana untuk mengulangi bekas C++ STL? Bagaimana untuk mengulangi bekas C++ STL? Jun 05, 2024 pm 06:29 PM

Untuk lelaran ke atas bekas STL, anda boleh menggunakan fungsi begin() dan end() bekas untuk mendapatkan julat lelaran: Vektor: Gunakan gelung for untuk lelaran ke atas julat lelaran. Senarai terpaut: Gunakan fungsi ahli seterusnya() untuk melintasi elemen senarai terpaut. Pemetaan: Dapatkan iterator nilai kunci dan gunakan gelung for untuk melintasinya.

Bagaimana untuk menggunakan warisan templat C++? Bagaimana untuk menggunakan warisan templat C++? Jun 06, 2024 am 10:33 AM

Warisan templat C++ membenarkan kelas terbitan templat menggunakan semula kod dan kefungsian templat kelas asas, yang sesuai untuk mencipta kelas dengan logik teras yang sama tetapi gelagat khusus yang berbeza. Sintaks warisan templat ialah: templateclassDerived:publicBase{}. Contoh: templateclassBase{};templateclassDerived:publicBase{};. Kes praktikal: Mencipta kelas terbitan Derived, mewarisi fungsi mengira Base kelas asas, dan menambah kaedah printCount untuk mencetak kiraan semasa.

Apakah aplikasi biasa templat C++ dalam pembangunan sebenar? Apakah aplikasi biasa templat C++ dalam pembangunan sebenar? Jun 05, 2024 pm 05:09 PM

Templat C++ digunakan secara meluas dalam pembangunan sebenar, termasuk templat kelas kontena, templat algoritma, templat fungsi generik dan templat pengaturcaraan meta. Sebagai contoh, algoritma pengisihan generik boleh mengisih tatasusunan jenis data yang berbeza.

Bagaimana untuk mengendalikan pengecualian C++ silang silang? Bagaimana untuk mengendalikan pengecualian C++ silang silang? Jun 06, 2024 am 10:44 AM

Dalam C++ berbilang benang, pengendalian pengecualian dilaksanakan melalui mekanisme std::promise dan std::future: gunakan objek promise untuk merekodkan pengecualian dalam utas yang membuang pengecualian. Gunakan objek masa hadapan untuk menyemak pengecualian dalam urutan yang menerima pengecualian. Kes praktikal menunjukkan cara menggunakan janji dan niaga hadapan untuk menangkap dan mengendalikan pengecualian dalam urutan yang berbeza.

See all articles