多线程是计算机或程序通过利用多个并发执行流(通常称为线程)同时或异步执行工作的能力。
在我的示例中,某些事件未得到处理(消息未打印),我不明白为什么。 为了激励我的代码一点:我想要解决的问题(当前)只是一个简单的闪烁 LED
我正在玩一些简单的 C++ 代码来解决有关线程的考试问题,其中线程调用 rand() (是的,我知道有充分的理由使用其他生成器,但是 w...
如果底层指针过期,std::atomic<std::weak_ptr<>>::compare_exchange_* 是否能保证正常工作?
我有一段代码,其中 std::atomic> 如果底层弱指针过期,其行为不会像我预期的那样: std::原子 我有一段代码,如果底层弱指针过期,std::atomic<std::weak_ptr<T>>的行为不会像我预期的那样: std::atomic<std::weak_ptr<Widget>> ptrAtomicWidget = ...; std::shared_ptr<Widget> ptrWidget = ptrAtomicWidget.load().lock(); while (ptrWidget == nullptr) { ptrWidget = std::make_shared<Widget>(); std::weak_ptr<Widget> ptrExpected; // <--- nullptr std::weak_ptr<Widget> ptrDesired = ptrWidget; // Problem Version: Causes an infinite loop when ptrExpected is expired if (!ptrAtomicWidget.compare_exchange_weak(ptrExpected, ptrDesired)) { ptrWidget = ptrExpected().lock(); } // Potential Repair Version: *seems* to work (could alternately move declaration of ptrExpected above while loop) if (!ptrAtomicWidget.compare_exchange_weak(ptrExpected, ptrDesired) && ptrExpected.expired() && !ptrAtomicWidget.compare_exchange_weak(ptrExpected, ptrDesired)) { ptrWidget = ptrExpected().lock(); } } 我遇到的问题涉及循环体“潜在修复版本”的“似乎有效”部分。修复需要两个不同的过期的weak_ptr在compare_exchange期间可靠地相互比较相等。 std::weak_ptr 没有相等运算符,因此其文档对此保持沉默。我能找到的关于 std::atomic<> 专业化的文档(例如 CPPReference)都没有描述指针过期时比较交换的行为。我不知道它是否恰好适用于我的特定编译器,或者 C++ 标准是否保证它。有人知道它是否能保证按标准工作吗? 您误解了弱指针 compare_exchange 何时成功的条件。 根据atomic<weak_ptr<T>>::compare_exchange_weak的规范: 效果:如果p等价于expected,则将desired分配给p,并且具有与success的值对应的同步语义,否则将p分配给expected并且具有同步语义对应于failure的值。 当两个指针等价时很重要,这也有解释: 备注:如果两个 weak_ptr 对象存储相同的指针值并且共享所有权或均为空,则它们是等效的。 弱形式可能会虚假失败。 请参阅[原子.类型.操作]。 初始化为 ptrExpected 的 nullptr 不存储与 ptrAtomicWidget 相同的指针值,因此第一次尝试比较交换总是会失败。 第二个“解决方法循环”“有效”,因为当第一次比较交换不可避免地失败时,ptrAtomicWidget的当前值被加载到ptrExpected中,这使得ptrDesired可以在第二次尝试时替换它。 对我来说,似乎 && ptrExpected.expired() 可以被删除,因为只有在 ptrWidget == nullptr 时你才会进入循环,这意味着 ptrAtomicWidget 为空或过期。
我正在使用Windows API编写多线程应用程序,我有操作系统创建的“主”线程来执行用户界面,而“工作”线程在后台执行其工作。工作时...
我正在开发一个应用程序,用于从彼此绑定的不同服务器获取数据。 基本上,每个服务器都有一个主要区域,例如美洲或亚洲,以及子区域,例如北美,
我有一个 C#/.Net 应用程序。 我使用 Monitor.Enter 和 Monitor.Exit 获取对某些对象的独占访问权限以同步线程。 我有一个特定的情况,线程 1 应该获得独占
在我的一个项目中,我有一台纳米计算机(嵌入式 Linux),它通过 UART 连接连接到微控制器。 两者都独立完成一些过程,但有时纳米计算机...
Delphi 有没有办法让我不必通过参数传递每个过程的会话对象? 我收到网络呼叫,我有接收所有呼叫数据的内部对象,并且
不同数据类型的Python成员变量在具有相同优先级的不同线程中未得到更新
考虑以下示例代码: 类测试: def __init__(self) -> 无: self.bool = False self.字符串=“” 线程 = 线程(目标 = self.target) 线程.s...
下面的代码是一个聊天室。首先我运行服务器,然后运行客户端。客户端通过套接字到达服务器。然后服务器接受连接,客户端必须输入他的昵称...
下面的代码是一个聊天室。首先我运行服务器,然后运行客户端。客户端通过套接字到达服务器。然后服务器接受连接,客户端必须输入他的昵称...
我正在使用c中的套接字编程与一些客户端设置服务器。 我发现为了拥有多个客户端,我应该使用线程或选择或轮询。 我知道我应该如何使用这些
我有一个函数可以随着时间增加数字。这是给一个进程;但在进程运行时它不会增加。我希望全局变量的值按常规递增
自从我开始编程以来,我总是一致认为线程阻塞是不好的——有些操作本质上是异步的,我们应该创建尊重的代码
我有一个用 springboot 应用程序编写的 Kafka 消费者,它使用来自 Kafka 主题(称为 matchupdates)的有效负载,处理它并将其保存到数据库。因为我收到了大量更新...
我们有一个包含许多(数百个)DLL 的应用程序。 EXE 直接依赖于其中的一部分(通过其导入表),而后者又依赖于另一部分(通过其导入表),依此类推。欧...
Java 中使用 Scanner 和 Thread 的并行字符串识别不起作用
对于个人项目,我正在研究一种通过 JOptionPane 识别字符串的方法。现在我的目标是当我将它放入控制台时也能识别它,然后关闭 JOptionPa...
Python 守护进程线程:如何从我的线程触发标志以退出主线程?
我正在使用Python线程,其中属性Daemon设置为true。我想触发我的线程中的标志,如果触发该线程,我想退出程序。在我的主循环中我得到...
我正在学习和测试python中的线程和Lock类,所以在这里我想为人员添加一个密钥,但是假设这需要一些时间,在另一个线程中我想读取密钥。在第一...