在已经运行的功能C 中更改变量

Changing a variable in an already running function C++

本文关键字:改变 变量 功能 运行      更新时间:2023-10-16

我正在创建我的第一个NACL应用程序并遇到问题。

我需要通过更改其条件来停止运行的while循环。

我的代码看起来喜欢以下方式:

int flag = 1;     
static void Test1() {
    while (flag) {
        sleep(2); 
    }    
}

我想通过调用另一个功能停止无限循环,以安全的方式更改flag(flag = 0(。我该如何在C ?

中执行此操作

您可以使用Atomic_int进行可以安全更改的变量:

std::atomic_int flag = 1;     
static void Test1() {
      while (flag) {
              sleep(2); 
       }    
}

您需要使用锁来确保您的写入安全并且不会损坏该值。您的线程库应为您提供锁。如果您的应用程序没有多线程,甚至不必担心添加此保护。

使用pthread posix库(请参阅https://docs.oracle.com/cd/e19683-01/806-6867/sync-12/index.html,有关一个更复杂的示例(:

(:
#include <pthread.h>
pthread_mutex_t g_flag_lock;
int g_flag;
void change_flag(int value) {
    pthread_mutex_lock(&g_flag_lock);
    g_flag = value;
    pthread_mutex_unlock(&g_flag_lock);
}

一般而言,您只需要在编写值时锁定。阅读通常不会引起问题(我可以想到我职业生涯中的一个实例我锁定了阅读,因为发生了一些时髦的事情(。

本质上,pthread_mutex_lock(&g_flag_lock);检查以确保当前没有其他线程锁定g_flag_lock。如果有一个,它会等到该线程再次解锁,然后自行捕获。

我还应该注意,随意使用锁并不明智。您会发现自己处于僵局状态。在编写多线程应用程序时,您确实需要考虑体系结构和时机。

我假设std::atomic类型简单地抽象了此模式。我不能确定。