Rumah > pembangunan bahagian belakang > C++ > Mengapa Program Berbilang Benang Dioptimumkan Saya Membeku Apabila Menggunakan Bendera Boolean Bukan Atom?

Mengapa Program Berbilang Benang Dioptimumkan Saya Membeku Apabila Menggunakan Bendera Boolean Bukan Atom?

Barbara Streisand
Lepaskan: 2024-12-28 00:33:19
asal
311 orang telah melayarinya

Why Does My Optimized Multithreaded Program Freeze When Using a Non-Atomic Boolean Flag?

Masalah Pengoptimuman Program Multithreading

Dalam kod anda, anda mempunyai atur cara berbilang thread di mana benang berasingan menambah pembilang sementara urutan utama menunggu satu saat dan kemudian menetapkan bendera untuk menandakan benang kaunter berhenti. Walau bagaimanapun, apabila berjalan dalam mod yang dioptimumkan (-O1 -O3), program akan tersekat tanpa mencetak sebarang output.

The Culprit: Non-Atomic Variable Access

The isu timbul daripada pembolehubah "selesai", iaitu bool ringkas yang diakses serentak oleh berbilang benang tanpa sebarang penyegerakan atau atomicity jaminan. Apabila diakses secara serentak, pembolehubah ini boleh membawa kepada tingkah laku tidak ditentukan (UB).

Penyelesaian: Gunakan std::atomic

Untuk menangani perkara ini, pembolehubah "selesai" harus diisytiharkan sebagai jenis atom, seperti std::atomic. std::atomic menyediakan jaminan atomicity, memastikan akses kepada pembolehubah disegerakkan dan ditakrifkan dengan baik.

Kod Disemak:

#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

Penjelasan:

Dalam kod yang disemak, pembolehubah "selesai" diisytiharkan sebagai std::atomic, memastikan akses atom. Ini menghalang gelagat tidak ditentukan yang menyebabkan atur cara membeku.

Nota Mengenai Pengoptimuman

Dalam mod dioptimumkan, pengkompil mungkin melakukan pengoptimuman agresif yang boleh menyebabkan masalah jika data tidak disegerakkan dengan betul. Dengan menggunakan std::atomic, anda secara eksplisit mengarahkan pengkompil untuk mengekalkan atomicity pembolehubah "selesai", walaupun dalam binaan yang dioptimumkan.

Atas ialah kandungan terperinci Mengapa Program Berbilang Benang Dioptimumkan Saya Membeku Apabila Menggunakan Bendera Boolean Bukan Atom?. 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