在已经运行的功能C 中更改变量
Changing a variable in an already running function C++
我正在创建我的第一个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
类型简单地抽象了此模式。我不能确定。
相关文章:
- 变量没有改变?通过向量的函数调用
- 在向量内更改变量的值不会改变其在向量外的值
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 标准在哪里定义了可变变量可以改变
- C++11:可变的 lambda 似乎没有改变变量?
- printf() 似乎改变了一个变量
- 为什么我的变量在单独的线程中修改时没有改变?C++/boost
- 为什么 Player.x 和 Player.y 变量没有改变?
- C - 如何将各处的静态函数称为改变其私有变量
- 即使"friend class rect"在平方类中被评论,为什么它要改变矩形类的私有变量?
- 为什么调用 CUDA 内核函数时这个类成员变量没有改变
- 全局变量的顺序会改变C /OpenGL的性能
- 为什么一个函数的末尾有常量这个词,即使它确实改变了一个变量
- 如何在C++中改变超类和子类的变量
- setRoomName不会改变变量roomName
- 不能改变变量的值
- 是否有一种方法可以改变变量在内存中的存储方式(位大小)
- Std::cout改变变量的值
- 使用引用改变变量的地址