Tag: 互斥

在使用带有信号处理程序的multithreading程序时,有没有办法确保primefaces性?

如果我有这样的程序(伪代码): mutex_lock; func() { lock(mutex_lock); // Some code (long enough to make a // race condition if no proper synchronisation // is available). We also going to call a signal, // say, SIGINT, through (ctrl-c), while we are in // the range of locking and unlocking the lock. unlock(mutex_lock); } sig_handler_func(sig) { // Say, we […]

如何保护isr和常规函数共享的全局变量?

假设我有function 1和一个isr routine ,它们共享并更新相同的标志,它们之间没有任何锁定。 系统是单线程的。 while将是一个3臂汇编指令,这意味着它不是primefaces操作,是否可以在非isr和isr函数之间共享一个全局变量而没有任何锁定或保护? function1: while (flag == false); flag = false; 常规: do something flag=true 我不记得有一个Linux内核机制用于在可睡眠和非可睡眠上下文之间进行锁定,例如irq和kernel thread 。 感谢@artless的答案,这里有一些我不确定的问题: 有没有办法我不会错过中断? 内存障碍如何解决问题,当代码在单个cpu上运行时它是否有效? 在不同情境之间使用障碍时的预期行为是什么? 在while loop睡眠可以解决同步问题吗?

互斥和信号量实际上做了什么?

我想要一些关于互斥和信号量的澄清。 我的问题是, 当线程试图进入由互斥锁锁定的区域时,互斥锁实际上做了什么。 它等待锁被释放? 或b。 它进入睡眠状态,直到释放锁定。 在那种情况下,如何在释放锁定时再次唤醒? 与1相同的问题,但在这种情况下它是信号量。 你能给我一些关于C中pthread中忙碌等待的代码,还有线程进入hibernate而不是等待的情况? 睡觉意味着它是阻塞还是睡觉是另一种忙碌的等待? 我想知道一些涵盖这种情况的程序,例如一些c源代码,其中实现繁忙等待,阻塞等。

c ++中的消费者/生产者

这是一个经典的c / p问题,其中一些线程产生数据而另一些线​​程读取数据。 生产者和消费者都共享一个const大小的缓冲区。 如果缓冲区为空,则消费者必须等待,如果它已满,则生产者必须等待。 我正在使用信号量来跟踪完整或空闲的队列。 生产者将减少信号量,增加价值和增加填充的信号量信号量。 所以我试图实现一个从生成器函数中获取一些数字的程序,然后打印出数字的平均值。 通过将其视为生产者 – 消费者问题,我试图节省一些时间来执行程序。 generateNumber函数导致进程有一些延迟,所以我想创建一些生成数字的线程,并将它们放入队列中。 然后运行main函数的“主线程”必须从队列中读取并找到总和然后平均。 所以这就是我到目前为止所拥有的: #include #include #include #include “Thread.h” #include int generateNumber() { int delayms = rand() / (float) RAND_MAX * 400.f + 200; int result = rand() / (float) RAND_MAX * 20; struct timespec ts; ts.tv_sec = 0; ts.tv_nsec = delayms * 1000000; nanosleep(&ts, […]

如何使用条件变量

Linux编程接口书有一段代码(生产者/消费者)来展示条件变量的工作原理: static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; static int avail = 0; while (TRUE) { s = pthread_mutex_lock(&mtx); while (avail == 0) { /* Wait for something to consume */ s = pthread_cond_wait(&cond, &mtx); } while (avail > 0) { /* Consume all available units */ avail–; } s = pthread_mutex_unlock(&mtx); […]

pthread互斥锁无法正常工作

我目前正在从麻省理工学院开放课件中学习C语言,在C语言中称为实践编程。在讨论multithreading中的竞争条件时,讲义包含一个具有竞争条件的程序示例以及如何使用互斥锁解决它。 代码在Linux系统上按预期工作,但在OS X上没有。 #include #include #include pthread_mutex_t mutex; // Added to fix race condition unsigned int cnt = 0; void *count(void *arg) { int i; for (i = 0; i < 100000000; i++) { pthread_mutex_lock(&mutex); // Added to fix race condition cnt++; pthread_mutex_unlock(&mutex); // Added to fix race condition } return NULL; } int main() […]

C&低级信号量实现

我正在考虑如何使用尽可能少的asm代码来实现信号量(不是二进制)。 我没有成功地在没有使用互斥锁的情况下思考和编写它,所以这是迄今为止我能做的最好的事情: 全球: #include #include #include #include typedef struct { atomic_ullong value; pthread_mutex_t *lock_op; bool ready; } semaphore_t; typedef struct { atomic_ullong value; pthread_mutex_t lock_op; bool ready; } static_semaphore_t; /* use with static_semaphore_t */ #define SEMAPHORE_INITIALIZER(value) = {value, PTHREAD_MUTEX_INITIALIZER, true} function: bool semaphore_init(semaphore_t *semaphore, unsigned long long init_value) { if(semaphore->ready) if(!(semaphore->lock_op = \ calloc(1, sizeof(pthread_mutex_t)))) […]