21xrx.com
2024-12-22 22:49:53 Sunday
登录
文章检索 我的文章 写文章
C++中如何多线程访问静态变量
2023-07-05 16:13:19 深夜i     --     --
C++ 多线程 静态变量 访问

C++是一种强大的面向对象编程语言,支持多线程并发编程。在多线程编程中,访问共享的静态变量是一个常见的需求。但如果不加控制地访问静态变量,就会导致意外的结果,甚至会导致程序崩溃。

为了解决这个问题,C++提供了一些机制来控制多线程对静态变量的访问。下面介绍几种常用的方法。

一、使用互斥锁(Mutex)

互斥锁是一种最常用的多线程同步机制之一,它可以保证同一时间只有一个线程访问共享的资源,从而防止了竞态条件(Race Condition)。在C++中,通过使用互斥锁,可以很容易地保护静态变量,避免多个线程同时访问它而导致数据不一致的问题。

下面是一个简单的例子:


#include <iostream>

#include <mutex>

#include <thread>

using namespace std;

static int count = 0; // 静态变量

static mutex mtx;   // 互斥锁

void increment_count()

{

  for (int i = 0; i < 100000; i++)

  {

    mtx.lock();

    count++;

    mtx.unlock();

  }

}

int main()

{

  thread t1(increment_count);

  thread t2(increment_count);

  t1.join();

  t2.join();

  cout << "count = " << count << endl;

  return 0;

}

在上面的例子中,我们定义了一个静态变量count和一个互斥锁mtx。然后,我们创建了两个线程,它们分别执行increment_count函数,每个函数会将count增加10万次。由于我们在访问count变量时使用了互斥锁,因此不会出现多个线程同时访问count的情况。

二、使用读写锁(Reader-Writer Lock)

读写锁是一种特殊的互斥锁,它允许多个线程同时读取共享数据,但只允许单个线程进行写操作。这种机制可以提高程序的并发性和效率,因为在大多数情况下,共享的数据是被多个线程同时读取的,而不是被写入。

在C++中,可以使用std::shared_mutex(C++17标准库中新增的一个类)来实现读写锁。下面是一个简单的例子:


#include <iostream>

#include <shared_mutex>

#include <thread>

using namespace std;

static int count = 0; // 静态变量

static std::shared_mutex s_mtx; // 读写锁

void increment_count()

{

  for (int i = 0; i < 100000; i++)

  {

    std::unique_lock<std::shared_mutex> lock(s_mtx);

    count++;

  }

}

void print_count()

{

  std::shared_lock<std::shared_mutex> lock(s_mtx);

  cout << "count = " << count << endl;

}

int main()

{

  thread t1(increment_count);

  thread t2(increment_count);

  thread t3(print_count);

  t1.join();

  t2.join();

  t3.join();

  return 0;

}

在上面的例子中,我们定义了一个静态变量count和一个读写锁s_mtx。然后,我们创建了两个线程,它们分别执行increment_count函数,每个函数会将count增加10万次。在访问count变量时,我们使用了unique_lock来进行带锁的写操作,从而避免了竞态条件。而在打印count变量时,我们使用了shared_lock来进行带锁的读操作,从而保证了多个线程同时访问count变量时的线程安全。

总结

使用互斥锁和读写锁是保护静态变量的常用方法,它们可以有效地避免多个线程同时访问共享数据而导致数据不一致的问题。但在实际的多线程编程中,还需要根据具体的场景选择合适的多线程同步机制,保证程序的正确性和性能。

  
  

评论区

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