问题标签 [condition-variable]
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.
pthreads - 使用 pthreads 的正确线程池
我正在尝试使用 pthreads 编写适合我目的的自定义线程池,而且我是 pthreads 的新手。我在线阅读了这些(POSIX 线程编程和Linux 教程 Posix 线程)教程,它们非常有帮助,但我仍然对互斥锁和条件变量有一些(可能是愚蠢的)疑问:
- 互斥锁的范围是什么?全局互斥锁是否会锁定所有全局变量,以便一次只有一个线程可以访问它们?如果我有两个全局互斥锁,它们会锁定同一组变量吗?在类或函数中声明的互斥锁怎么样,当我锁定/解锁它时会发生什么?
- 如果我只是打算读取一个全局变量,根本不修改它,我还应该使用互斥锁吗?
- 如果我是正确的,则使用条件变量来唤醒
pthread_cond_wait()
在某些条件下正在休眠(或使用阻塞)的其他线程。对休眠线程的唤醒呼叫由其他线程发出pthread_cond_signal()
或pthread_cond_broadcast()
由其他线程发出。控制流应该如何发生,以便一些全部或一个线程唤醒以完成工作并等待下一个工作可用?我对具有 4 个线程的场景特别感兴趣。 - 有没有办法在创建线程之前设置线程与特定处理器核心的亲和性(以便它开始在所需的核心上执行并且在创建后不会发生核心移动)?
如果这些问题看起来很愚蠢,我很抱歉,但正如我所说,我对此并不陌生。任何帮助、评论、代码或指向良好资源的指针都值得赞赏。在此先感谢您的帮助。
c++ - C++11 std::condition_variable:我们可以将锁直接传递给通知线程吗?
我正在学习 C++11 并发,我之前唯一的并发原语经验是在六年前的操作系统课上,所以如果可以的话,请保持温和。
在 C++11 中,我们可以写
这很好用,但是我对需要cv.wait
循环包装感到生气。我们需要循环的原因对我来说很清楚:
现在,我相信其中一件很酷的事情unique_lock
是我们可以传递它,对吧?因此,如果我们可以这样做,那将是非常优雅的:
现在 Vulture 线程无法突袭,因为互斥锁从I MADE YOU A COOKIE
到一直保持锁定状态YUM
。另外,如果notify()
需要您传递锁,这是确保人们在调用之前实际锁定互斥锁的好方法notify()
(请参阅Signaling a condition variable (pthreads))。
我很确定 C++11 没有这个习语的任何标准实现。其历史原因是什么(仅仅是 pthreads 没有这样做吗?那么为什么会这样)?是否有技术原因导致冒险的 C++ 编码人员无法在标准 C++11 中实现这个习语,也许称之为my_better_condition_variable
?
我也有一种模糊的感觉,也许我正在重新发明信号量,但我对学校的记忆不够,不知道这是否准确。
multithreading - pthread_cond_wait 在等待时自动原子地解锁互斥锁
从这里开始:https ://computing.llnl.gov/tutorials/pthreads/#ConVarSignal
请注意,pthread_cond_wait 例程将在等待时自动且原子地解锁互斥锁。
以下子代码来自同一链接(由我格式化):
问题:
当它说pthread_cond_wait
在等待时会自动解锁互斥锁,那么为什么我们必须在上面的代码末尾显式指定函数?pthread_mutex_unlock
我错过了什么?
operating-system - 一个简单的解释在哪里以及如何使用条件变量?
google 了将近 2 个小时,想知道使用条件变量的情况有哪些。但我只发现了一堆难以实现的恼人的代码片段。所以我需要对此有一个清晰的概念。
python - Python条件变量超时
我有 thread1 正在等待来自 thread2 的条件。但可能是 thread2 从来没有发出条件变量的信号。所以我wait
在线程 1 的调用中添加了超时,如下所示:
我如何知道条件变量是否已发出信号或发生超时?wait
似乎没有返回任何值。Condition Objects上的 python 文档对此没有提供任何线索。
c++ - 使用 condition_variable 控制多线程流
我还没有完全理解 C++11 多线程的东西,但是我试图让多个线程等到主线程上的某个事件,然后所有线程同时继续(处理发生的事情),wait
当他们再次'完成处理......循环直到它们被关闭。下面不完全是 - 这是我的问题的更简单再现:
这行得通……除非我停在一些断点上并放慢速度。当我这样做时,我看到Go1!
然后挂起,等待thread2
's cv.wait
。怎么了?
也许我无论如何都不应该使用条件变量...... 周围没有任何条件wait
,也没有需要用互斥锁保护的数据。我应该怎么做?
c++ - C++11 我可以确保 condition_variable.wait() 不会错过通知吗?
我有线程 1 执行以下代码:
线程 2 执行此代码:
不幸的是,我遇到了时间问题:
线程 1 完全错过了通知,并在 wait() 上保持阻塞。我尝试使用带有谓词但结果基本相同的 wait() 版本。也就是说,谓词的主体执行检查,但在它返回之前,条件的值会发生变化并发送通知。然后谓词返回。
我怎样才能解决这个问题?
c++ - C/C++ - 共享内存中的环形缓冲区(POSIX 兼容)
我有一个应用程序,生产者和消费者(“客户”)想要相互发送广播消息,即n:m
关系。所有这些都可能是不同的程序,因此它们是不同的进程而不是线程。
为了减少n:m
到更易于维护的东西,我正在考虑一个设置,比如引入一个小的中央服务器。该服务器将提供一个套接字,每个客户端都可以连接到该套接字。
每个客户端都会通过该套接字向服务器发送一条新消息 - 导致1:n
.
服务器还将提供对客户端只读的共享内存。它将被组织为一个环形缓冲区,新消息将由服务器添加并覆盖旧消息。
这会给客户一些时间来处理消息 - 但如果它太慢,那就是运气不好,无论如何它都不再相关了......
我看到这种方法的优点是我避免了同步以及不必要的数据复制和缓冲区层次结构,中央一个应该就足够了,不是吗?
到目前为止,这就是架构 - 我希望它有意义......
现在到了实现它的更有趣的方面:
环形缓冲区中最新元素的索引是共享内存中的一个变量,客户端只需等待它发生变化。而不是愚蠢的while( central_index == my_last_processed_index ) { /* do nothing */ }
我想释放 CPU 资源,例如通过使用pthread_cond_wait()
.
但这需要一个我认为我不需要的互斥锁——另一方面,为什么 pthreads 的条件变量函数需要一个互斥锁?给我的印象是我最好问问我的架构是否有意义并且可以这样实现......
如果所有这些都有意义并且可行,你能给我一个提示吗?
(旁注:客户端程序也可以用 Perl 和 Python 等通用脚本语言编写。因此与服务器的通信必须在那里重新创建,因此不应该太复杂甚至专有)
multithreading - 寻找一种单写多读多线程通信的设计
应用上下文如下:
- 它是一个单进程多线程程序
- 它专为自动期货交易而设计。在期货交易市场中,有数百个活跃的期货合约。每份合约的市场数据称为分时数据,每 500 毫秒从 Future-Exchange 推送一次。每个自动期货交易策略都作为一个线程运行。每个策略都需要不同合约的实时市场数据。例如:策略A需要合约A1、合约A2、合约A3的行情数据。策略B需要合约A1、合约B1和合约B2的行情数据。
- 该程序中的一个线程作为市场数据接收器运行,它接收所有合约的市场数据并将它们保存在数据缓冲区中,交易后可以将其保存到磁盘数据库中。因此,这个线程可以作为数据生产者进行审查,而策略线程可以作为数据消费者进行审查。所以这个场景是一个单生产者多消费者的问题。设计必须确保所有策略线程都能有效地获取他们需要的分时数据。
- 一种可能的设计是:所有消费者都等待一个条件变量并尝试获取共享锁。当一个新的tick到来时,单个生产者会尝试获得一个排他锁并将这个tick数据保存到数据缓冲区中。然后它用条件变量通知所有消费者。当通知消费者时,它会检索数据缓冲区以查看它需要的合约数据是否更新(通过比较时间戳)。如果不是,它将再次等待条件变量。但是这种低效率的设计,每一个新的到来的tick数据都会导致所有的消费者醒来并检索数据缓冲区(检索的过程可能很耗时)无论消费者是否需要数据。
- 一个改进的设计是:定义一个全局变量来存储新来的分时数据。当有新的分时数据到来时,生产者将更新全局变量并将分时数据存储到数据缓冲区中,然后通知所有消费者。消费者醒来,只需检查全局变量以查看刻度数据是否符合他们的需要(无需检索整个数据缓冲区)。但问题是存在一些竞争条件。可能在消费者获得共享锁之前,另一个新的滴答数据到来,生产者提前获得锁并更新全局变量。所以消费者会错过一个滴答数据。有更好的设计吗?(比如用unix domain socket来广播?不知道unix domain socket是否可以在多线程之间应用,如果可以,对比共享内存效率如何?)
c++ - C++ 11 - condition_variable - wait_until 没有按预期工作
我已经实现了一个示例程序来了解 wait_for 和 wait_until 在 C++11 中是如何工作的。
代码 -
输出 -
sampleFunction 正在按预期工作,因为它在“完成”之前打印“发生超时”,但 sampleFunctionCond 的情况并非如此。虽然它知道 wait_until 已超时,但它会在函数 sampleFunctionCONd 完成执行后打印消息。
有人可以帮我理解吗?谢谢。