Git   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了InterlockedExchange()和线程安全大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

volatile LONG g_lRunning = 1; bool IsRunningEx() { return ::InterlockedExchange(&g_lRunning,1) == 1; } bool IsRunning() { return g_lRunning == 1; } void Close() { ::InterlockedExchange(&g_lRunning,falSE); } void f1() { while (IsRunning()) { // do some thing } } void f2() { Close(); } int _tmain(int argc,_TCHAR* argv[]) { std::thread t1(f1); std::thread t2(f2); t1.detach(); t2.detach(); return 0; } void f1_() { while (IsRunningEx()) { // do some thing } ::InterlockedExchange(&g_lRunning,falSE); // I must do some thing like this in here or in IsRunningEx internal,// because after calling IsRunningEx() g_lRunning will be TRUE. // So when call IsRunningEx() next time,it will return TURE,// but it would return falSE in hope. }

它是线程安全的,直接在IsRunning()读取g_lRunning并在Close()上面的代码中使用InterlockedExchange编写g_lRunning ?

如果我用f1_replacef1 , f1_我会在f1_注释一个问题,你有什么更好的想法(不要在c ++ 11中使用atom)

Visual studio交叉编译到Linux

在Linux中tesTing外部未定义的引用

将按键发送到X窗口

从c#窗口中的文本文件SELEct随机的名字不可重复

如何获取与打开的句柄关联的名称

http 1.0相比,http 1.1的延迟时间为20秒

游标在input时离开窗口(ncurses)

如何对C中包含“%”的String执行strcmp?

如何创build“@R_301_2483@协议”并将其映射到应用程序?

方法为“之后”button点击

关于问题1:


据我了解,直接读取g_lRunning是安全的。 写操作必须是原子的,所以对于每个写操作,都有一个InterlockedXXX函数,但是读操作不需要是原子操作,并且没有InterlockedXXX函数用于读取。

当谈到线程安全时,你需要记住volatile不能保证获取/释放的语义,但在你的情况下,这不应该是一个问题。

关于问题2:


你也可以使用return ::InterlockedCompareExchange(&g_lRunning,0) == 1 。 你可以用你喜欢的任何值替换两个零。

如果你可以使用C ++ 11,我真的推荐使用新的std::atomic 。

它看起来像你创建一个SimpleSpinLock,所以值得注意的是,当你在while循环中运行时,你正在旋转并浪费cpu周期。 如果您打算长时间旋转,内核模式锁定可能会更有效。

大佬总结

以上是大佬教程为你收集整理的InterlockedExchange()和线程安全全部内容,希望文章能够帮你解决InterlockedExchange()和线程安全所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: