目录
Semaphore信号量
在 C++ 中,可以使用std::Semaphore
类来实现信号量。信号量可以用于控制对资源的访问,例如限制同时执行任务的线程数量。
在 C++11 中,std::Semaphore
类提供了以下常用函数:
-
Semaphore()
:构造函数,创建一个信号量对象。 -
Semaphore(int count)
:带初始计数的构造函数,可以指定信号量的初始值。 -
operator int()
:重载运算符,返回信号量的当前值。 -
void acquire()
:获取信号量。如果信号量的值大于 0,则将其减 1,并立即返回;如果信号量的值为 0,则阻塞当前线程,直到有其他线程释放信号量。 -
void release()
:释放信号量。将信号量的值加 1,并唤醒一个或多个等待的线程。 -
bool try_acquire()
:尝试获取信号量。如果信号量的值大于 0,则将其减 1,并立即返回true
;如果信号量的值为 0,则立即返回false
,不会阻塞当前线程。
这些函数是std::Semaphore
类的常用接口,用于控制对资源的访问。你可以根据需要使用这些函数来实现线程同步和资源管理。
以下是一个使用信号量的简单示例:
#include <iostream>
#include < semaphore>
#include <thread>
std::Semaphore semaphore(5);
void worker() {
// 获取信号量
semaphore.acquire();
std::cout << "Worker acquired a semaphore" << std::endl;
// 执行工作
std::this_thread::sleep_for(std::chrono::seconds(1));
// 释放信号量
semaphore.release();
std::cout << "Worker released a semaphore" << std::endl;
}
int main() {
std::thread threads[10];
for (int i = 0; i < 10; ++i) {
threads[i] = std::thread(worker);
}
for (int i = 0; i < 10; ++i) {
threads[i].join();
}
return 0;
}
在上述示例中,创建了一个信号量semaphore
,初始值为 5。然后,创建了 10 个工作线程,并让它们循环获取和释放信号量。
通过使用信号量,可以控制同时执行工作的线程数量,确保最多有 5 个线程同时工作。这样可以实现线程池的同步,防止过多的线程同时执行任务。
请注意,std::Semaphore
在 C++11 及更高版本中可用。如果你使用的是较旧的 C++ 标准,可以考虑使用其他的信号量实现,例如SystemV
信号量。
Semaphore与condition_variable的区别
在 C++11 中,Semaphore
(信号量)和condition_variable
(条件变量)都是用于线程同步的工具,但它们的用途略有不同。
Semaphore
用于控制对资源的访问。它提供了一个计数器,可以限制同时访问资源的线程数量。当计数器大于 0 时,线程可以获取资源;当计数器为 0 时,线程将被阻塞,直到有其他线程释放资源。condition_variable
用于等待某个条件的发生。它通常与互斥锁一起使用,以确保在条件满足之前,只有一个线程可以执行等待操作。当条件不满足时,等待的线程将被阻塞;当条件满足时,condition_variable
会通知一个或多个等待的线程。
简单来说,Semaphore
用于限制资源的并发访问,而condition_variable
用于等待某个条件的发生。两者通常结合使用,以实现更复杂的线程同步逻辑。