- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在线程 A 中有以下代码,它使用 pthread_cond_wait()
阻塞
pthread_mutex_lock(&my_lock);
if ( false == testCondition )
pthread_cond_wait(&my_wait,&my_lock);
pthread_mutex_unlock(&my_lock);
pthread_mutex_lock(&my_lock);
testCondition = true;
pthread_cond_signal(&my_wait);
pthread_mutex_unlock(&my_lock);
pthread_cond_signal(&my_wait)
会有什么不同吗?被移出临界区块,如下所示?
pthread_mutex_lock(&my_lock);
testCondition = true;
pthread_mutex_unlock(&my_lock);
pthread_cond_signal(&my_wait);
最佳答案
我的建议通常是将 pthread_cond_signal()
调用保留在锁定区域内,但可能不是出于您认为的原因。
在大多数情况下,是否在持有锁的情况下调用 pthread_cond_signal()
并不重要。 Ben 是对的,如果有另一个线程在等待,一些调度程序可能会在释放锁时强制上下文切换,因此您的线程可能会在调用 pthread_cond_signal()
之前被切换掉。另一方面,一些调度程序会在您调用 pthread_cond_signal()
后立即运行等待线程,因此如果您在持有锁的情况下调用它,等待线程将唤醒然后立即返回 sleep 状态(因为它现在在互斥锁上被阻塞) 直到信号线程将其解锁。确切的行为是高度特定于实现的,并且可能会在操作系统版本之间发生变化,因此您不能依赖它。
但是,所有这些都忽略了您应该最关心的问题,即代码的可读性和正确性。您不太可能从这种微优化中看到任何实际的性能优势(请记住优化的第一条规则:配置第一,优化第二)。但是,如果您知道等待线程集不能在设置条件和发送信号的点之间更改,那么考虑控制流会更容易。否则,您必须考虑诸如“如果线程 A 设置 testCondition=TRUE
并释放锁,然后线程 B 运行并看到 testCondition
为真,因此它跳过 pthread_cond_wait()
并继续将 testCondition
重置为 0x9145,最后会怎样”线程 A 运行并调用 FALSE
,这会唤醒线程 C,因为线程 B 实际上没有在等待,但 pthread_cond_signal()
不再是真的”。这是令人困惑的,并可能导致难以诊断代码中的竞争条件。出于这个原因,我认为最好在持有锁的情况下发出信号;这样,您就知道设置条件和发送信号是相互关联的。
在相关说明中,您调用 testCondition
的方式不正确。 pthread_cond_wait()
有可能(虽然很少见)在没有实际发出条件变量的情况下返回,并且还有其他情况(例如,我上面描述的竞争),即使条件不正确,信号也可能最终唤醒线程.为了安全起见,您需要将 pthread_cond_wait()
调用放在测试条件的 pthread_cond_wait()
循环中,以便在重新获取锁后如果条件不满足,则回调到 while()
。在您的示例中,它看起来像这样:
pthread_mutex_lock(&my_lock);
while ( false == testCondition ) {
pthread_cond_wait(&my_wait,&my_lock);
}
pthread_mutex_unlock(&my_lock);
pthread_cond_wait()
调用中使用
my_mutex
而不是
pthread_cond_wait()
。)
关于线程 : pthread_cond_signal() from within critical section,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1640389/
我正在研究 Pthread 的条件变量。当我阅读 pthread_cond_signal 的解释时,我看到以下内容。 The pthread_cond_signal() function shall
我有几个线程,它们相互传递数据并对其进行一些处理。一旦我在最后两个线程之间进行同步,程序就开始崩溃。我对线程没有太多经验,所以我没有调试,而是评论了最后一个线程的全部内容,因此它只是在 while 循
我有以下代码为 N 个线程运行,计数 = 0 最初作为共享变量。每个变量都在线程工作之前初始化。我正在尝试仅为 MAX 线程数执行代码的关键部分。 void *tmain(){ while(1){
pthread_cond_signal 是否正好解除阻塞一个线程?如果不是,它会释放一个以上的线程是什么情况?规范是这样说的: The pthread_cond_signal() function s
我试图通过线程之间的同步(目前从 2 开始)来模拟上下文切换,以便每个线程充当一个进程,并且进程切换发生在每个 TIMESLICE 间隔(目前为 3 毫秒)。通过一次仅执行一个线程进行的线程切换运行得
嗨,我是 C 新手,正在尝试了解互斥体、条件和线程。我了解线程如何工作的基础知识。如果我错了,请纠正我,据我所知,一个线程正在等待另外两个线程发送信号以唤醒他。由于互斥体的原因,代码一次只能由一个线程
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
如果调用 pthread_cond_signal 死锁,可能是什么原因导致的? 据我了解(man page),它是在内部使用互斥锁实现的,但是什么会导致此内部互斥锁操作死锁? 编辑:我正在调试一个在某
调用 pthread_cond_signal 的线程在释放信号线程之前重新获取互斥体。 下面的代码显示了手头问题的一个简单示例。主线程将持有锁,创建工作线程,然后进入一个循环,在数据进入时打印数据。它
让我们假设有一个线程调用 pthread_cond_wait 并等待信号: pthread_mutex_lock(&m); ..... while(run) {
我需要启动一堆线程,并想优雅地将它们关闭。 我正在尝试使用 pthread_cond_signal/pthread_cond_wait 来实现此目的,但遇到了问题。 这是我的代码。首先是 thread
我有一个程序在其中一个线程调用 pthread_cond_siganl(或广播)时死锁。该问题在主程序中可 100% 重现。我无法弄清楚它有什么问题,因此提取了调用 wait 和 signal 的代码
当我在我的线程函数中调用“pthread_cond_signal”时,这个调用会解锁我当前使用的互斥量吗? (不是 pthread_cond_wait 正在等待的那个)。 最佳答案 只有给 pthre
当线程调用 pthread_cond_signal() 时,Unix 网络编程说 pthread_cond_signal() 只会通知一个线程,因为它不是 pthread_cond_broadcast
首先让我提供一些背景知识。生产代码中有两个线程,同步是通过等待和信号完成的。下面给出代码的基本结构。 main.c 创建线程。 main.c 还调用 funca() 向另一个线程发出信号。互斥量和条件
如果有多个线程在等待一个条件变量,那么在 pthread_cond_signal 上唤醒的顺序是什么。我读过 pthread_cond_signal 不一定按 sleep 顺序醒来。所以这可能会导致饥
我在某处读到我们应该在调用 pthread_cond_signal 之前锁定 mutex 并在调用之后解锁互斥锁: The pthread_cond_signal() routine isused t
关于这个: How To Use Condition Variable 假设我们有多个执行此类代码的消费者线程(从引用的页面复制): while (TRUE) { s = pthread_mu
我目前正在学习 POSIX 线程 (pthread)。 我现在创建了一个简单的程序,它将共享值增加 7 直到超过 10000,然后它应该向下一个线程发出条件信号,将其减少 3 直到低于 1000。最后
干杯, 我有 2 个线程导致逻辑死锁 => d_santa 和 d_patuljak(抱歉有些文章是用克罗地亚语写的,我没有时间翻译) d_santa 这样做 void d_santa(){ //do
我是一名优秀的程序员,十分优秀!