当前位置: 首页 > 知识库问答 >
问题:

pthread_mutex_lock()能否在pthread_cond_wait()解除阻止之前解除阻止?

太叔昊穹
2023-03-14

假设一个线程在条件变量上阻塞:

pthread_mutex_lock (mutex);
do_something ();
pthread_cond_wait(cond, mutex); // [1]
do_something_else ();
pthread_mutex_unlock (mutex);

互斥锁被解锁,尝试锁定互斥锁的其他线程被解锁:

pthread_mutex_lock (mutex);
do_some_work ();
pthread_cond_signal (cond);
pthread_mutex_unlock (mutex);

同时还有另一个线程正在等待获取关键部分的所有权:

pthread_mutex_lock (mutex); // [2]
do_some_random_work ();
pthread_mutex_unlock (mutex);

现在的问题是:调用pthread_cond_signal()时,是否保证pthread_cond_wait()[1]将在pthread_mutex_lock()[2]之前解除阻塞?

POSIX规范似乎没有说明这种情况。

共有1个答案

郝昊天
2023-03-14

不,不是。

pthread_cond_signal()的描述有时被写成

当每个线程由于pthread_cond_signal()或pthread_cond_broadcast()从其对pthread_cond_wait()或pthread_cond_timedwait()的调用返回而解除阻塞时,该线程拥有其调用pthread_cond_wait()或pthread_cond_timedwait()的互斥锁。被解除阻止的线程根据调度策略(如果适用)争夺互斥锁,就好像每个线程都调用了pthread_mutex_lock()。

(摘自此链接)

如你所见,它的措辞是“好像每个人都叫pthread_mutex_lock()”。因此,与来自另一个线程的实际pthread_mutex_lock调用相比,这个隐含pthread_mutex_lock调用没有优先级。

 类似资料:
  • 问题内容: 我经历了这里列出的类似案例,但似乎没有用。 我使用MySQL Workbench与托管在另一台服务器上的数据库建立连接。尝试了几次,无法连接,然后出现此错误。我对我应该在哪里冲洗感到困惑。在PhpMyadmin下的SQL查询?Cos当我尝试输入以下命令时,它作为语法错误返回。我使用的是Windows操作系统,因此也没有输入我的外壳程序脚本。我现在正在通过Cpanel / phpmyad

  • 问题内容: 当从cmd行执行某些命令(比如说“ x”)时,我收到以下消息:“ …按任意键继续…。”。因此,它等待用户输入解除阻止。 但是当我从Java执行相同的命令(’x’)时: 代码块… 我试图在进程的输出流中写入一些内容,但是我该怎么做,以确保代码从未到达该行? 问题答案: 我认为(虽然不能确定)您是在谈论Windows而不是Unix? 如果是这样,则命令行进程实际上可能不是在等待按键(或输入

  • 我不知所措。我有一个阻塞请求 此代码通常会阻塞<code>队列。takeFirst()当队列中没有项目时。但是,一旦我按预期添加了项目,它就不会解除阻止。调试时,我可以看到中的项目,并且当我停止Tomcat时,我会序列化。启动后,我将对队列进行反序列化,并在那一点上对<code>队列进行反串行化。takeFirst()检索项目(与之前未检索的相同)并提交它。 有人有什么想法吗? 编辑 再强调一下我

  • 每当我尝试使用axios发送删除endpoint的请求时,都会出现以下错误: 通过CORS策略阻止从源http://localhost:3000在http://localhost:8080/api/payment_card/delete/1234123412343433处访问XMLHttpRequest:对预检请求的响应未通过权限改造检查:请求的资源上不存在“Access-Control-Allo

  • 本文向大家介绍了解节点中代码执行的阻塞和解除阻塞,包括了了解节点中代码执行的阻塞和解除阻塞的使用技巧和注意事项,需要的朋友参考一下 现在,我们在fs模块中具有文件写入功能writeFileSync,如下所示- 同步表示已同步。这是一个阻塞代码示例。一旦文件写入完成,则仅对其余文件执行代码。上面的代码比较简单,但是如果我们进行大量的文件处理操作,将会导致应用性能下降。 这种代码执行方式将减慢其他请求

  • 我有多个读线程和一个写线程。如果我锁定其中一个读线程上的互斥体并从中发送广播,是否可以保证互斥体将由等待pthread_cond_wait()的写线程锁定,或者另一个正在等待pthread_mutex_lock()的读线程将锁定互斥体?主要问题是pthread_cond_wait()是否比pthread_mutex_lock()具有优先级? 如果不是,如何实现互斥锁始终由pthread_cond_