我正在创建我的第一个nacl应用程序并遇到问题。
我需要通过更改其条件来停止正在运行的while
循环。
我的代码看起来像这样:
int flag = 1;
static void Test1() {
while (flag) {
sleep(2);
}
}
我想通过调用另一个函数来停止无限循环,以安全的方式更改flag
(flag = 0
)。我怎么能用C ++做到这一点?
答案 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
类型只是抽象这种模式。我不能肯定地说。