- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 Pthread 的条件变量。当我阅读 pthread_cond_signal
的解释时,我看到以下内容。
The
pthread_cond_signal()
function shall unblock at least one of the threads that are blocked on the specified condition variable cond (if any threads are blocked oncond
).
直到现在我才知道 pthread_cond_signal()
一次只会唤醒一个线程。但是,引用的解释说至少一个。这是什么意思?它能唤醒一个以上的线程吗?如果有,为什么会有pthread_cond_broadcast()
?
En passant,我希望以下代码取自UNIX Systems Programming book of Robbins也和我的问题有关。作者在 waitbarrier 函数中使用 pthread_cond_broadcast()
而不是 pthread_cond_signal()
有什么原因吗? 作为次要的一点,为什么 !berror
也需要检查作为谓词的一部分? 当我通过更改尝试这两个时,我看不出任何区别。
/*
The program implements a thread-safe barrier by using condition variables. The limit
variable specifies how many threads must arrive at the barrier (execute the
waitbarrier) before the threads are released from the barrier.
The count variable specifies how many threads are currently waiting at the barrier.
Both variables are declared with the static attribute to force access through
initbarrier and waitbarrier. If successful, the initbarrier and waitbarrier
functions return 0. If unsuccessful, these functions return a nonzero error code.
*/
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
static pthread_cond_t bcond = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t bmutex = PTHREAD_MUTEX_INITIALIZER;
static int count = 0;
static int limit = 0;
int initbarrier(int n) { /* initialize the barrier to be size n */
int error;
if (error = pthread_mutex_lock(&bmutex)) /* couldn't lock, give up */
return error;
if (limit != 0) { /* barrier can only be initialized once */
pthread_mutex_unlock(&bmutex);
return EINVAL;
}
limit = n;
return pthread_mutex_unlock(&bmutex);
}
int waitbarrier(void) { /* wait at the barrier until all n threads arrive */
int berror = 0;
int error;
if (error = pthread_mutex_lock(&bmutex)) /* couldn't lock, give up */
return error;
if (limit <= 0) { /* make sure barrier initialized */
pthread_mutex_unlock(&bmutex);
return EINVAL;
}
count++;
while ((count < limit) && !berror)
berror = pthread_cond_wait(&bcond, &bmutex);
if (!berror) {
fprintf(stderr,"soner %d\n",
(int)pthread_self());
berror = pthread_cond_broadcast(&bcond); /* wake up everyone */
}
error = pthread_mutex_unlock(&bmutex);
if (berror)
return berror;
return error;
}
/* ARGSUSED */
static void *printthread(void *arg) {
fprintf(stderr,"This is the first print of thread %d\n",
(int)pthread_self());
waitbarrier();
fprintf(stderr,"This is the second print of thread %d\n",
(int)pthread_self());
return NULL;
}
int main(void) {
pthread_t t0,t1,t2;
if (initbarrier(3)) {
fprintf(stderr,"Error initilizing barrier\n");
return 1;
}
if (pthread_create(&t0,NULL,printthread,NULL))
fprintf(stderr,"Error creating thread 0.\n");
if (pthread_create(&t1,NULL,printthread,NULL))
fprintf(stderr,"Error creating thread 1.\n");
if (pthread_create(&t2,NULL,printthread,NULL))
fprintf(stderr,"Error creating thread 2.\n");
if (pthread_join(t0,NULL))
fprintf(stderr,"Error joining thread 0.\n");
if (pthread_join(t1,NULL))
fprintf(stderr,"Error joining thread 1.\n");
if (pthread_join(t2,NULL))
fprintf(stderr,"Error joining thread 2.\n");
fprintf(stderr,"All threads complete.\n");
return 0;
}
最佳答案
由于spurious wake-ups pthread_cond_signal
可以唤醒多个线程。
在 pthread_cond_wait.c 中查找单词“spurious”来自 glibc。
在 waitbarrier
中,它必须在所有线程都到达该点时唤醒所有线程,因此它使用 pthread_cond_broadcast
。
关于pthread_cond_signal 可以唤醒多个线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55935188/
我正在研究 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
我是一名优秀的程序员,十分优秀!