Rumah > pembangunan bahagian belakang > C++ > Mengapa Program Berbilang Benang Saya Berhenti dalam Mod Dioptimumkan Tetapi Berfungsi dalam -O0?

Mengapa Program Berbilang Benang Saya Berhenti dalam Mod Dioptimumkan Tetapi Berfungsi dalam -O0?

Patricia Arquette
Lepaskan: 2024-12-29 22:02:30
asal
650 orang telah melayarinya

Why Does My Multithreaded Program Stall in Optimized Mode But Work in -O0?

Program Multithreading Berhenti dalam Mod Dioptimumkan tetapi Berjalan Biasa dalam -O0

Isu ini timbul daripada program multithreading di mana pembolehubah kongsi bukan atom. Khususnya, masalahnya terletak pada pembolehubah boolean selesai yang diakses oleh dua utas tanpa sebarang penyegerakan atau atomicity.

Dalam mod yang dioptimumkan, pengkompil menganggap pembolehubah kongsi yang diakses oleh berbilang utas dilindungi. Walau bagaimanapun, dalam program ini, selesai diisytiharkan sebagai bool biasa, menjadikannya bukan atom. Ini membolehkan pengkompil mengoptimumkan mekanisme penyegerakan yang penting untuk operasi berbilang benang.

Untuk menyelesaikan isu ini, selesai hendaklah diisytiharkan sebagai std::atomic. Jenis ini menyediakan operasi baca dan tulis atom, memastikan akses serentak kepada pembolehubah kekal jelas dan konsisten.

Kod Tetap:

#include <iostream>
#include <future>
#include <atomic>

static std::atomic<bool> finished = false;

int func()
{
    size_t i = 0;
    while (!finished)
        ++i;
    return i;
}

int main()
{
    auto result = std::async(std::launch::async, func);
    std::this_thread::sleep_for(std::chrono::seconds(1));
    finished = true;
    std::cout << "result = " << result.get();
    std::cout << "\nmain thread>
Salin selepas log masuk

Demo Langsung: coliru

Pertimbangan Tambahan:

  • Pembolehubah meruap sahaja tidak dapat menjamin atomicity. Walaupun ia menghalang pengkompil daripada mengoptimumkan operasi baca/tulis, ia tidak menyediakan halangan memori atau primitif penyegerakan.
  • Penyusun moden sangat agresif dalam pengoptimuman. Adalah penting untuk menunjukkan secara eksplisit kawasan memori yang dikongsi dan keperluan penyegerakan sumber untuk mengelakkan tingkah laku yang tidak dijangka.

Atas ialah kandungan terperinci Mengapa Program Berbilang Benang Saya Berhenti dalam Mod Dioptimumkan Tetapi Berfungsi dalam -O0?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan