- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于 pthread_cond_broadcast
的 pthread 示例唤醒是稀疏的,我写了一个,但不确定这是否正确同步以及如何做到这一点:
pthread_cond_wait
返回测试是否确实满足某些条件?在我的情况下,每个广播调用都应该唤醒每个线程一次,但没有其他人应该这样做。 (我会防止虚假唤醒吗?)pthread_cond_wait
在示例代码中尝试延迟取消也没有成功作为取消点so . #include <pthread.h>
#include <iostream>
#include <unistd.h>
struct p_args{
int who;
};
pthread_cond_t c; //share between compilation units
pthread_mutex_t mtx;
void *threadFunc(void *vargs){
//pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
struct p_args * args = (struct p_args *) vargs;
while(true){
//wait for trigger one loop
pthread_mutex_lock(&mtx);
pthread_cond_wait(&c, &mtx);
pthread_mutex_unlock(&mtx);
//should be entangled output showing concurrent execution
std::cout << "t " << args->who << std::endl;
/* expensive work */
}
delete args;
}
int main(int argc, char* argv[])
{
pthread_cond_init(&c, NULL);
pthread_mutex_init(&mtx, NULL);
pthread_t thread_id[2];
struct p_args *args0 = new p_args();
struct p_args *args1 = new p_args();
args0->who = 0;
args1->who = 1;
pthread_create(&thread_id[0], NULL, threadFunc, args0);
pthread_create(&thread_id[1], NULL, threadFunc, args1);
sleep(3);
pthread_mutex_lock(&mtx);
pthread_cond_broadcast(&c);
pthread_mutex_unlock(&mtx);
sleep(3);//test if thread waits
pthread_cancel(thread_id[0]);
pthread_cancel(thread_id[1]);
pthread_join (thread_id[0], NULL);
pthread_join (thread_id[1], NULL);
//could perform cleanup here
return 0;
}
Regarding exiting deferred:
thread_id[0] exits fine and i am stuck in line `pthread_join (thread_id[1], NULL);`, it says (Exiting) but seems stuck on a lock, with debugger:
<br>
[![enter image description here][2]][2]
<br>
#include <pthread.h>
#include <iostream>
#include <unistd.h>
struct p_args{
int who;
};
pthread_cond_t c;
pthread_mutex_t mtx;
bool doSome[2];
bool exitFlag;
void *threadFunc(void *vargs){
struct p_args * args = (struct p_args *) vargs;
while(true){
//wait for trigger one loop
pthread_mutex_lock(&mtx);
do {
pthread_cond_wait(&c, &mtx);
if(exitFlag) {
std::cout << "return " << args->who << std::endl;
delete args;
pthread_mutex_unlock(&mtx);
return NULL;
}
} while(doSome == false);
doSome[args->who] = false;
pthread_mutex_unlock(&mtx);
std::cout << "t " << args->who << std::endl;
}
}
int main(int argc, char* argv[])
{
pthread_cond_init(&c, NULL);
pthread_mutex_init(&mtx, NULL);
pthread_t thread_id[2];
struct p_args *args0 = new p_args();
struct p_args *args1 = new p_args();
args0->who = 0;
args1->who = 1;
doSome[0] = doSome[1] = true;
exitFlag = false;
pthread_create(&thread_id[0], NULL, threadFunc, args0);
pthread_create(&thread_id[1], NULL, threadFunc, args1);
doSome[0] = doSome[1] = true;
pthread_cond_broadcast(&c);
sleep(3);
doSome[0] = doSome[1] = true;
pthread_cond_broadcast(&c);
sleep(3);
exitFlag = true;
pthread_cond_broadcast(&c);
pthread_join (thread_id[0], NULL);
pthread_join (thread_id[1], NULL);
return 0;
}
最佳答案
- do all threads share the same c and mtx variable?
- is it necessary upon pthread_cond_wait return to test if some condition is actually met?
- the program currently does not exit ...
pthread_cancel
都是可怕的,永远不应该使用。真的很难做对。如果您想告诉您的线程退出,请编写一个通知机制 - 将其构建到现有的谓词循环中 - 并发出信号/广播以确保所有线程都唤醒并意识到是时候死了。
Regarding exiting deferred: thread_id[0] exits fine and i am stuck in line pthread_join (thread_id[1], NULL);, it says (Exiting) but seems stuck on a lock
pthread_cancel
的困难之一是清理。如果在您持有锁时发生取消,您需要使用
pthread_cleanup_push
模拟取消兼容的 RAII 语义。否则,第一个线程可能(在这种情况下确实)在互斥锁仍被锁定的情况下死亡。
pthread_const_wait
退出。由于取消,但它需要重新获得锁定并且不能。
void *thread(void *data)
{
struct Args *args = (struct Args *)data;
/* this lock protects both the exit and work predicates.
* It should probably be part of your argument struct,
* globals are not recommended.
* Error handling omitted for brevity,
* but you should really check the return values.
*/
pthread_mutex_lock(&args->mutex);
while (!exit_predicate(args)) {
while (!work_predicate(args)) {
/* check the return value here too */
pthread_cond_wait(&args->condition, &args->mutex);
}
/* work_predicate() is true and we have the lock */
do_work(args);
}
/* unlock (explicitly) only once.
* If you need to cope with cancellation, you do need
* pthread_cleanup_push/pop instead.
*/
pthread_mutex_unlock(&args->mutex);
return data;
}
bool exit_predicate(struct Args*)
,
bool work_predicate(struct Args*)
和
void do_work(struct Args*)
.循环结构本身很少需要改变。
关于multithreading - 通过 pthread_cond_broadcast 触发多个 pthread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51019730/
我有一个工作线程池。每个 worker 执行这个例程: void* worker(void* args){ ... pthread_mutex_lock(&mtx); while (que
根据我昨天的问题,here ,我编写了一个小代码示例,它启动了一些计数和一些等待线程。等待线程将停止 pthread_cond_wait 直到收到信号。计数线程完成任务后发送信号。 等待线程接收信号,
我正在使用 POSIX,并且有 3 个线程。 请注意下面的所有线程都使用相同的互斥锁。 线程 1 正在使用 pthread_cond_wait 等待满足条件(等待在 while 循环内,因此也不是无条
我想从主线程向等待条件的所有其他线程发送广播信号。在我看来,广播信号来得早。 #include #include #define NUM 4 #define SIZE 256 using name
我真的很难理解如何以允许线程同时运行的方式锁定和解锁互斥体。现在我试图让每个线程都做一些事情,然后等到所有线程都准备好,然后重复它。这应该反复发生,所以我把它都放在一个条件循环中。我的问题是,似乎我的
我写了这个程序: pthread_cond_t placeFootCondition; pthread_mutex_t rf,lf; void* rss(void* in){ while(1)
假设广播线程在只有 3 个线程等待时进行广播,并且在广播线程完成广播后第 4 个线程调用 pthread_cond_wait,第 4 个线程是否会脱离等待状态。以及如何重置条件变量,以便广播线程有时可
对于 pthread_cond_t,我们必须关联一个互斥体,当发出条件信号时,我看到了如下代码 pthread_mutex_lock(&mutex); //code that makes condit
在 linux 2.6.30 中使用 pthreads 我试图发送一个信号,这将导致多个线程开始执行。广播似乎只被一个线程接收到。我已经尝试过 pthread_cond_signal 和 pthrea
我有一个带有“管理器”线程的简单应用程序,它产生十个简单的“工作器”线程。我希望所有“工作”线程都阻塞在同一个条件变量(即:condvar)上,并且我希望通过 pthread_cond_broadca
我想使用 pthread_cond_broadcast() 唤醒所有等待相同条件的线程。 但是,这些线程似乎不能真正并行运行,因为它们必须共享相同的互斥体。 我说的对吗?或者有什么办法吗? 提前致谢。
所以我搜索了关于堆栈溢出和其他资源的高低,但我无法理解与上述功能有关的一些事情。具体来说, 1)当pthread_cond_timedwait()因为定时器值用完而返回时,它如何自动重新获取互斥量。互
如果我调用 pthread_cond_broadcast 并且没有人在等待条件,pthread_cond_broadcast 是否会调用上下文切换和/或调用内核? 如果不是,我可以依靠它非常快吗(我的
我有一个“服务器”进程a,可能还有多个“客户端”进程b。服务器创建一个共享内存文件 (shm_open),其中包含一个 pthread_mutex_t 和一个 pthread_cond_t,用于向客户
由于 pthread_cond_broadcast 的 pthread 示例唤醒是稀疏的,我写了一个,但不确定这是否正确同步以及如何做到这一点: 所有线程是否共享相同的 c 和 mtx 变量? 是否需
我有一个结构数组。每个结构体如下。 struct thread_st { pthread_t thr; int conn; pthread_mutex_t mutex;
我是多线程新手,遇到了段错误。我正在使用 void addfunction(void *xyz) { flag_TO_go = 1; pthread_cond_broadcast(&c
条件变量通常用于在互斥量下修改它们所指的状态。然而,当状态只是一个单一的只设置标志时,就不需要互斥锁来阻止同时执行。所以有人可能想做这样的事情: flag = 1; pthread_cond_broa
在我的程序中有一部分代码等待被其他部分代码唤醒: 这是进入休眠的部分: void flush2device(int task_id) { if (pthread_mutex_lock(&id2cvLo
我正在尝试使用 LD_PRELOAD 机制插入对 pthread_cond_broadcast 的调用。我插入的 pthread_cond_broadcast 函数只是调用原始的 pthread_co
我是一名优秀的程序员,十分优秀!