21xrx.com
2024-12-22 22:31:26 Sunday
登录
文章检索 我的文章 写文章
C++多线程编程中的信号量
2023-06-29 08:23:44 深夜i     --     --
C++ 多线程编程 信号量

信号量在C++多线程编程中扮演着很重要的角色。它们可以用来同步和互斥访问共享资源。

信号量是一个整数值,表示可用资源的数量。当某个线程需要访问共享资源时,它会尝试获取信号量。如果信号量值大于0,线程就可以访问共享资源,并将信号量值减少1。如果信号量值为0,线程就必须等待,直到其他线程释放共享资源并增加信号量值为止。

信号量还可以用来控制线程的执行顺序。例如,可以创建两个线程并给它们分配一个信号量。一个线程在访问共享资源前必须等待信号量大于0,而另一个线程在访问共享资源前必须等待信号量等于0。通过这种方式,可以保证这两个线程的执行顺序。

C++标准库提供了标准的信号量实现,可以通过调用std::semaphore类来使用。下面是一个使用std::semaphore实现线程同步的例子:


#include <iostream>

#include <thread>

#include <mutex>

#include <chrono>

#include <semaphore>

std::mutex print_mutex;

std::semaphore sem(1);

void worker(int id) {

  for (int i = 0; i < 5; i++) {

    sem.acquire(); //等待资源

    std::lock_guard<std::mutex> lock(print_mutex);

    std::cout << "Thread " << id << " is working." << std::endl;

    sem.release(); //释放资源

    std::this_thread::sleep_for(std::chrono::milliseconds(100)); //模拟工作

  }

}

int main() {

  std::thread t1(worker, 1);

  std::thread t2(worker, 2);

  t1.join();

  t2.join();

  return 0;

}

在这个例子中,两个线程t1和t2在获取和释放信号量sem时进行同步。每个线程都会获取信号量,以确保输出的顺序正确,然后释放信号量,以便另一个线程可以获取它。

信号量是C++多线程编程的一个重要概念。正确使用信号量可以确保线程安全和同步,从而避免竞态条件和死锁等问题。需要注意的是,在使用信号量时,线程必须满足正确的获取和释放信号量的顺序,否则可能会导致死锁或其他问题。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复