在C++中,信號量(semaphore)是一種用于控制多個進程或線程對共享資源訪問的同步原語
<semaphore.h>
頭文件以使用信號量功能。#include <semaphore.h>
sem_t sem;
sem_init(&sem, 0, 1); // 初始化信號量,初始值為1
這里,sem_init
函數的第一個參數是一個指向信號量對象的指針,第二個參數是信號量的共享屬性(0表示共享,1表示獨占),第三個參數是信號量的初始值。
sem_wait
或sem_trywait
函數實現。sem_wait(&sem); // 等待信號量變為可用狀態
// 訪問共享資源
如果信號量的值為0,sem_wait
函數會阻塞線程,直到信號量變為可用狀態。sem_trywait
函數則嘗試立即獲取信號量,如果信號量不可用,它會立即返回一個錯誤代碼,而不是阻塞線程。
sem_post
函數實現。// 訪問完共享資源后
sem_post(&sem); // 釋放信號量
sem_post
函數會將信號量的值加1,表示一個資源已經被釋放。
sem_destroy
函數實現。sem_destroy(&sem); // 銷毀信號量對象
這是一個簡單的C++信號量示例,用于控制對共享資源的訪問:
#include <iostream>
#include <thread>
#include <semaphore.h>
std::mutex mtx;
sem_t sem;
int shared_resource = 0;
void thread_func(int id) {
sem_wait(&sem); // 等待信號量變為可用狀態
std::unique_lock<std::mutex> lock(mtx);
std::cout << "Thread " << id << " is accessing the shared resource." << std::endl;
shared_resource++;
lock.unlock();
// 模擬訪問共享資源的時間
std::this_thread::sleep_for(std::chrono::milliseconds(100));
lock.lock();
std::cout << "Thread " << id << " has finished accessing the shared resource." << std::endl;
shared_resource--;
lock.unlock();
sem_post(&sem); // 釋放信號量
}
int main() {
const int num_threads = 5;
std::thread threads[num_threads];
sem_init(&sem, 0, 1); // 初始化信號量,初始值為1
for (int i = 0; i < num_threads; ++i) {
threads[i] = std::thread(thread_func, i);
}
for (int i = 0; i < num_threads; ++i) {
threads[i].join();
}
sem_destroy(&sem); // 銷毀信號量對象
return 0;
}
在這個示例中,我們創建了一個信號量來控制對共享資源shared_resource
的訪問。信號量的初始值為1,表示同一時間只有一個線程可以訪問共享資源。其他線程需要等待信號量變為可用狀態才能訪問共享資源。