在已经运行的函数C ++中更改变量

时间:2017-05-04 18:00:42

标签: c++ c++11

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

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

我的代码看起来像这样:

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

我想通过调用另一个函数来停止无限循环,以安全的方式更改flagflag = 0)。我怎么能用C ++做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以将atomic_int用于可以安全更改的变量:

{{1}}

答案 1 :(得分: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类型只是抽象这种模式。我不能肯定地说。