Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Laksanakan pengaturcaraan benang menggunakan C++

Laksanakan pengaturcaraan benang menggunakan C++

WBOY
WBOYasal
2023-08-22 12:15:15650semak imbas

Laksanakan pengaturcaraan benang menggunakan C++

Dengan perkembangan berterusan teknologi komputer, pemproses berbilang teras dan pengaturcaraan berbilang benang telah menjadi teknologi yang semakin penting dan biasa. Sebagai bahasa pengaturcaraan berorientasikan objek yang digunakan secara meluas, C++ mempunyai kelebihan unik dalam merealisasikan pengaturcaraan berbilang benang. Artikel ini akan memperkenalkan cara menggunakan C++ untuk melaksanakan pengaturcaraan benang, termasuk penciptaan benang, penyegerakan dan pengecualian bersama.

1. Konsep asas utas

Benang ialah unit pelaksanaan asas proses. Benang mempunyai ciri-ciri berikut:

(1) Benang adalah sebahagian daripada proses dan oleh itu berkongsi ruang memori proses tersebut.

(2) Benang boleh dilaksanakan secara serentak, yang meningkatkan kecekapan menjalankan program.

(3) Data boleh dikongsi antara urutan, tetapi mereka juga menghadapi masalah persaingan data.

(4) Benang mempunyai proses pelaksanaan bebas dan boleh mempunyai susunan dan daftarnya sendiri, dsb.

2. Penciptaan benang

C++ menyediakan pelbagai kaedah untuk mencipta benang, yang paling biasa digunakan ialah menggunakan kelas benang.

(1) Cipta objek benang

Gunakan pembina kelas benang untuk mencipta objek benang, seperti kod berikut:

#include <iostream>
#include <thread>

void func()
{
    std::cout << "hello from thread" << std::endl;
}

int main()
{
    std::thread t(func);
    t.join();
    return 0;
}

Dalam kod di atas, fungsi func ialah fungsi pelaksanaan benang, gunakan std::thread t(func) Buat objek thread, panggil t.join() dalam fungsi utama untuk melaksanakan thread, dan tunggu thread selesai melaksanakan sebelum keluar dari program.

(2) Melepasi parameter

Jika anda perlu menghantar parameter dalam benang, anda boleh menghantar parameter semasa mencipta objek benang, seperti kod berikut:

#include <iostream>
#include <thread>

void func(int num)
{
    std::cout << "hello from thread " << num << std::endl;
}

int main()
{
    std::thread t(func, 3);
    t.join();
    return 0;
}

Dalam kod di atas, fungsi func mempunyai int type parameter num, dalam Pass parameter 3 apabila mencipta objek thread.

3. Penyegerakan benang

Apabila berbilang utas dilaksanakan pada masa yang sama, beberapa masalah mungkin berlaku, seperti persaingan data, kebuntuan, dsb. Untuk mengelakkan masalah ini, konsep penyegerakan benang mesti diperkenalkan.

(1) Mutex

Mutex ialah salah satu mekanisme penyegerakan benang yang paling biasa digunakan, yang boleh menghalang berbilang rangkaian daripada mengakses sumber dikongsi pada masa yang sama. C++ menyediakan kelas std::mutex untuk melaksanakan mutex, seperti kod berikut:

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

std::mutex mtx;

void func()
{
    mtx.lock();
    std::cout << "hello from thread" << std::endl;
    mtx.unlock();
}

int main()
{
    std::thread t(func);
    mtx.lock();
    std::cout << "hello from main" << std::endl;
    mtx.unlock();
    t.join();
    return 0;
}

Dalam kod di atas, mtx.lock() dan mtx.unlock() digunakan untuk mengunci dan membuka kunci mutex masing-masing. Mutex digunakan dalam kedua-dua fungsi func dan fungsi utama untuk mengunci dan membuka kunci pernyataan output, yang memastikan bahawa pernyataan output dilaksanakan dalam susunan yang ditentukan.

(2) Pembolehubah keadaan

Pembolehubah keadaan ialah mekanisme penyegerakan benang yang boleh digunakan untuk menunggu syarat tertentu dipenuhi sebelum meneruskan pelaksanaan. C++ menyediakan kelas std::condition_variable untuk melaksanakan pembolehubah keadaan, seperti kod berikut:

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

std::mutex mtx;
std::condition_variable cv;
bool flag = false;

void func1()
{
    std::unique_lock<std::mutex> ul(mtx);
    while(!flag)
    {
        cv.wait(ul);
    }
    std::cout << "hello from thread1" << std::endl;
}

void func2()
{
    std::unique_lock<std::mutex> ul(mtx);
    flag = true;
    cv.notify_one();
}

int main()
{
    std::thread t1(func1);
    std::thread t2(func2);

    t1.join();
    t2.join();
    return 0;
}

Dalam kod di atas, cv.wait(ul) digunakan untuk menunggu bendera pembolehubah keadaan dipenuhi sebelum meneruskan pelaksanaan, dan cv.notify_one() digunakan untuk Memberitahu urutan menunggu pembolehubah keadaan ini. Tetapkan bendera kepada benar dalam fungsi func2 dan maklumkan utas menunggu pembolehubah keadaan ditetapkan semula.

4. Ringkasan

Artikel ini memperkenalkan cara menggunakan C++ untuk melaksanakan pengaturcaraan benang, termasuk penciptaan benang, penyegerakan dan pengecualian bersama. Dengan mengkaji artikel ini, anda akan mempelajari cara menggunakan mekanisme penyegerakan benang seperti mutex dan pembolehubah keadaan untuk mengelakkan masalah yang mungkin timbul apabila berbilang benang dilaksanakan serentak.

Atas ialah kandungan terperinci Laksanakan pengaturcaraan benang menggunakan C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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