问题标签 [synchronisation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
raspberry-pi - Raspberry Pi 上的 IMU-Camera 时间同步
我正在使用 MPU6050 IMU 和树莓派。我想以所需的频率获取数据,例如 200 Hz,即我希望每 0.005 秒获取一次数据。我该如何继续实现这一目标?我正在使用 i2c 进行串行通信。随意建议我可以完成此任务的任何其他方法。
java - 同步块无法正常工作
我正在尝试运行以下代码,但无法获得正确的输出。
预期输出“欢迎新程序员”
实际输出“新欢迎程序员”
我在这里做错了什么?有人可以纠正我吗?
java - Java Netty 保持与客户端的开放连接
我用 java 编写了一个 netty 网络服务器和一个带有 html、css 和 javascript 的简单网站。网络服务器是我的 discordbot 的网络界面。
我的问题:
如果有人在 Web 界面中执行操作,我想为所有用户更新网站。
例如,如果有人点击网站上的跳过按钮,我希望该操作影响网站上的所有用户。
java - Java:线程能够调用位于其他线程同步块中的方法
线程t1
正在调用test1()
Test类对象ob的方法。
线程在同步块t2
中调用test1()
Test类对象ob的方法。即使ob 的方法调用在线程的同步块中,
t1
也能够调用ob 的方法。test1()
test1()
t2
代码如下:
c++ - 条件变量的“等待”函数在提供谓词时导致意外行为
作为一项教育练习,我正在使用条件变量实现一个线程池。控制器线程创建一个等待信号的线程池(一个原子变量被设置为大于零的值)。当通知线程唤醒时,执行它们的工作,当最后一个线程完成时,它通知主线程唤醒。控制器线程阻塞,直到最后一个线程完成。然后该池可用于后续重复使用。
时不时地,我在等待工作人员发出完成信号的控制器线程上超时(可能是因为减少活动工作计数器时的竞争条件),所以为了巩固池,我更换了“wait(lck )”形式的条件变量的等待方法,带有“wait(lck, predicate)”。由于这样做,线程池的行为似乎允许将活动工作计数器递减到 0 以下(这是重新唤醒控制器线程的条件) - 我有一个竞争条件。我在 stackoverflow 和其他各种网站上阅读了无数关于原子变量、同步、内存排序、虚假和丢失唤醒的文章,并尽我所能结合了我所学的知识,并且仍然无法为我的生活弄清楚为什么我编写谓词等待的方式不起作用。计数器只能与池中的线程数(例如 8)一样高,并且低至零。我开始对自己失去信心——做一些从根本上简单的事情不应该这么难。很明显,我还需要在这里学习其他东西 :)
当然考虑到存在竞争条件,我确保驱动池的唤醒和终止的两个变量都是原子的,并且只有在使用 unique_lock 保护时才会更改。具体来说,我确保当向池发起请求时,获取锁,活动线程计数器从 0 更改为 8,解锁互斥锁,然后“notified_all”。控制器线程只有在活动线程计数为零时才会被唤醒,一旦最后一个工作线程将其递减到那么远并且“notified_one”。
在工作线程中,条件变量只有在活动线程计数大于零时才会等待并唤醒,解锁互斥锁,并行执行创建池时预分配给处理器的工作,重新获取互斥锁,并以原子方式减少活动线程数。然后,虽然它仍然应该受到锁的保护,但测试它是否是最后一个仍然处于活动状态的线程,如果是,则再次解锁互斥锁和“notify_one”以唤醒控制器。
问题是 - 即使只有 1 或 2 次迭代,活动线程计数器也会反复低于零。如果我在新工作负载开始时测试活动线程数,我会发现活动线程数在 -6 左右减少 - 就好像允许池在工作完成之前重新唤醒控制器线程一样。
鉴于线程计数器和终止标志都是原子变量,并且只在同一个互斥锁的保护下被修改,我对所有更新使用顺序内存排序,我只是看不到这是如何发生的,我迷路了。
performance - 在 setter - getter 中同步类属性是否会影响线程安全性?
我在类属性中有竞争条件。一个线程正在读取它,另一个线程正在写入。现在我想出了一个解决方案来同步该属性的 getter 和 setter。问题是这会影响应用程序的性能吗?如果是,除了同步属性还有其他解决方案吗?
c - 在 Cortex M0 上不禁用中断的同步机制
为了澄清一个问题,假设我们有:
- 静态按钮对象:
static Button_T sButton = {0};
- 获取按钮的函数:从主循环上下文
void GetButton(Button_T * p_button);
调用 - ISR 处理程序:
void ButtonISRHandler(void);
假设:
GetButton
执行可以被任何不执行的中断中断ButtonISRHandler
ButtonISRHandler
执行可以被其他中断中断GetButton
执行所需的时间少于两次ButtonISRHandler
中断调用之间的最短时间。- 按钮中断是例如每 10 毫秒触发一次的循环中断。
- 在
ButtonISRHandler
我们有检查按钮 PIN 状态或检测按钮是否被触摸(在触摸按钮情况下)等程序。如果给定的 PIN 状态在例如 5 次连续调用中是稳定的,sButton
则更新对象状态。 Button_T
是通用对象 - 它可以是经典的轻触开关或触摸按钮等。ScanButtonAndUpdate
可以处理 Button_T 对象的列表,但GetButton
函数仅在一个按钮对象上运行。
问题是:当程序计数器在内部时可能发生中断的经典案例GetButton
问题是:如何在不禁GetButton
用ButtonISRHandler
中断的情况下同步?
我的目标处理器是没有 LDREX/STREX 操作的 Cortex M0,所以我不能使用 C11 中的原子,这在这种情况下将是一个很好的解决方案。
我提出的解决方案
使用关键部分GetButton
。
如果程序计数器在临界区内时发生中断,则不要ScanButtonAndUpdate
在中断中处理,而是在中处理ExitCriticalSection
。推迟ScanButtonAndUpdate
执行。
不可能同时ScanButtonAndUpdate
从中断和主上下文调用函数 - 此行为受信号量保护
执行
这个解决方案已经过测试并且运行良好,没有问题,但我不确定这是没有隐藏错误的最佳解决方案。
编辑 1:更新了假设并添加了缺失的ScanButtonAndUpdate
功能
c++ - std::memory_order_acquire 和 memory_order_release 可以分开使用吗?
cppreference说这std::memory_order_acquire
将防止读写在它之前重新排序。所以我可以std::memory_order_acquire
只用于防止在运行时重新排序而没有相应的std::memory_order_release
. 例如
真的吗?
grails - 如何解决同步方法中的连接关闭问题?
在我们的应用程序中,我们使用 grails 框架和 SQL 服务器作为数据库。我们有多个站点,这些站点可以有多个用户(几个用户),如果他们通过 AJAX 访问相同的方法,这可能会导致问题,所以我们将该方法设置为同步方法,并最大限度地减少我们存储数据的数据库交互基于站点的地图,因为来自一个站点的所有用户都将获得相同的数据,如果数据超过 10 秒,我们会从数据库中获取数据并更新地图对象。在这里,我们在从数据库获取站点对象的同步方法的第一行中遇到了很多数据库连接关闭问题。这里有什么问题,我们如何解决这个问题?
c++ - 将 VkSemaphores 存储在同步管理器类的 std::unordered_map 中是不好的做法吗?
Vulkan API要求您使用VkSemaphores同步您的渲染。例如,在渲染一帧时,我们必须等到可以从交换链中获取下一张图像。我们还必须表示可以开始呈现渲染图像。每个Vulkan 教程都会讨论这一点。
信号量在初始化期间创建并在关闭期间销毁。在我能找到的任何示例代码(Sascha Willems,官方 Khronos 示例..)中,VkSemaphore 作为类成员存储在渲染器类中。我想知道是否可以通过创建一个 VulkanSemaphoreManager 类来抽象问题,该类将由渲染器类继承。简而言之,这个类将信号量存储在一个 unordered_map 中,其中 std::string (我给信号量的名称)作为键:
此类捆绑所有现有的信号量并提供创建和获取方法。它还负责在应用程序关闭期间销毁所有信号量。
但是有一个问题:我们不能将新的 VkSemaphore 插入 unordered_map,因为 Vulkan 定义信号量是不可调度的句柄。
毕竟这是个好主意吗?
谢谢你的反馈,约翰。