21xrx.com
2024-11-13 06:33:05 Wednesday
登录
文章检索 我的文章 写文章
C++多线程下如何同步修改全局变量
2023-06-21 02:17:05 深夜i     --     --
C++、多线程、同步、修改、全局变量

随着计算机性能的提升和应用场景的不断拓展,多线程编程已经成为了必不可少的一部分。而在多线程环境中,对于共享资源的修改需要特别小心,否则会带来诸多问题。本文将具体介绍在C++多线程环境下如何同步修改全局变量。

首先,我们需要弄清楚什么是全局变量。全局变量是指定义在程序文件的外部,作用域为整个程序文件的变量。全局变量可以在任何函数内部都使用,不需要传递参数即可对其进行操作。此外,在多线程环境中,全局变量还有一个特点,就是多线程都可以对其进行修改,因此需要通过同步来保证其正确性。

针对全局变量的同步,有两种常用的方法:互斥锁和条件变量。互斥锁的主要作用是对共享资源的访问进行加锁,即当一个线程已经获得了该互斥锁时,其他线程不能进行修改,只有等到该线程释放锁之后,其他线程才能进行操作。而条件变量则是在多线程中进行线程间通信的一个重要工具,相比于互斥锁更加灵活。使用条件变量可以使得线程在等待某个条件满足时处于阻塞状态,从而节省CPU资源。

下面,我们将通过简单的示例代码来介绍如何使用互斥锁和条件变量对全局变量进行同步。

使用互斥锁的示例代码如下:


#include <iostream>

#include <thread>

#include <mutex>

using namespace std;

int global_var = 0;

mutex var_mutex;

void modify_var()

{

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

    var_mutex.lock();

    ++global_var;

    var_mutex.unlock();

  }

}

int main()

{

  thread t1(modify_var);

  thread t2(modify_var);

  t1.join();

  t2.join();

  cout << "Global var: " << global_var << endl;

  return 0;

}

在上述代码中,我们创建了两个线程,同时对全局变量进行修改。通过定义一个互斥锁var_mutex,并在修改全局变量之前进行加锁操作,使得每个线程在修改时都是独占的,从而保证了操作的正确性。

使用条件变量的示例代码如下:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

using namespace std;

int global_var = 0;

mutex var_mutex;

condition_variable var_cond;

void modify_var()

{

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

    unique_lock<mutex> lock(var_mutex);

    ++global_var;

    if (global_var == 100000) {

      var_cond.notify_one();

    }

  }

}

int main()

{

  thread t1(modify_var);

  thread t2(modify_var);

  unique_lock<mutex> lock(var_mutex);

  var_cond.wait(lock, [] return global_var == 100000; );

  t1.join();

  t2.join();

  cout << "Global var: " << global_var << endl;

  return 0;

}

在上述代码中,我们同样创建了两个线程,对全局变量进行修改。但不同的是,当全局变量的值达到100000时,我们使用了条件变量var_cond来通知等待的线程。在主线程中,通过unique_lock 对互斥锁进行了加锁,然后等待条件var_cond。当全局变量的值达到100000后,我们通过var_cond.notify_one()来唤醒一个等待线程,从而实现线程的同步。

总之,在C++多线程环境下,同步修改全局变量是一项必要的工作,它能够保证线程间的协作和正确性。我们可以使用互斥锁或条件变量等工具来实现同步。需要注意的是,不同的同步工具,其适用场景和复杂度是不同的,程序员需要根据具体的需求进行选择。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复
    相似文章