Tag: 信号量

单个生产者/消费者循环缓冲区,仅阻止消费者

我想用单个生产者和单个消费者实现一个缓冲区,其中只有消费者可能被阻止。 这里重要的细节是,如果队列已满,生产者可以删除更新。 我考虑过转换一个等待免费的实现,但乍一看似乎没有简单的方法来通知消费者新的数据已经到达而不会丢失通知。 所以我使用计数信号量确定了下面非常简单的方法(为清楚起见,省略了一些error handling细节): Object ar[SIZE]; int head = 0, tail = 0; sem_t semItems; // initialized to 0 void enqueue(Object o) { int val; sem_getvalue(&semItems, &val); if (val < SIZE – 1) { ar[head] = o; head = (head + 1) % SIZE; sem_post(&semItems); } else { // dropped } } Object dequeue(void) […]

可能的堆栈损坏

参考我之前关于GDB未查明SIGSEGV点的问题 , 我的线程代码如下: void *runner(void *unused) { do { sem_wait(&x); … if(/*condition 1 check*/) { sem_post(&x); sleep(5); sem_wait(&x); if(/*repeat condition 1 check; after atleast 5 seconds*/) { printf(“LEAVING…\n”); sem_post(&x); // putting exit(0); here resolves the dilemma return(NULL); } } sem_post(&x); }while(1); } 主要代码: sem_t x; int main(void) { sem_init(&x,0,1); … pthread_t thrId; pthread_create(&thrId,NULL,runner,NULL); … pthread_join(thrId,NULL); […]

在pthreads中唤醒单个线程而不是忙等待

我不确定这个标题是否反映了我在这里所要求的内容,但是如果没有一个非常强大的标题我就能做到最好。 我正在尝试在pthreads实现一个worker thread模型。 我想从main函数中生成一组线程,然后main线程将作业委托给worker并等待所有线程完成,然后再将它们分配给下一个作业(实际上,要求是将线程排列在一个块中像CUDA编程模型,但在CPU上。虽然它与当前的问题无关)。 job数组用于指示每个线程的作业类型。 目前,我已经使用信号量实现了这一点,这使得繁忙的等待。 我正在寻找方法来使线程进入睡眠状态,只有在需要时才会唤醒,而不是连续轮询。 每个线程执行的function volatile int jobs[MAX_THREADS]; // global job indicator array sem_t semaphore; // semaphore to indicate completion thread_execute(void *args) { tid = get_id(args); while(jobs[tid] != -1) { if(jobs[tid] == 0) continue; // no job if(jobs[tid] == JOBS_1) { jobs1(); jobs[tid] = 0; // go back to idle state sem_post(&semapahore); […]

这种信号量的实现如何工作?

圣诞快乐! 我正在读“信号量小书” 。 书中有一个C语言的实现,我并不完全理解。 请参阅下面的代码。 有这个唤醒变量。 作者解释说: 唤醒计算未决信号的数量; 也就是说,已被唤醒但尚未恢复执行的线程数。 唤醒的原因是为了确保我们的信号量具有第4.3节中描述的属性3 和 属性3:如果线程执行信号时有线程在等待信号量,则必须唤醒其中一个等待线程。 好的,我想我理解了这个属性的含义。 其中一个等待线程应该获取互斥锁而不是另一个(例如信令线程)。如果我错了,请纠正我。 我不明白的是这个机制如何保证这个属性。 我会说房产不保证。 非等待进程仍然可能获得互斥锁。 我错过了什么? typedef struct { int value, wakeups; Mutex *mutex; Cond *cond; } Semaphore; // SEMAPHORE Semaphore *make_semaphore (int value) { Semaphore *semaphore = check_malloc (sizeof(Semaphore)); semaphore->value = value; semaphore->wakeups = 0; semaphore->mutex = make_mutex (); semaphore->cond = make_cond […]

C信号量:sem_wait抛出莫名其妙的错误

我正在研究一个我们必须使用信号量来解决的问题。 我有一个包含两个信号量的数组, sem_wait(&(gsem[me])) ,并且在某些条件下调用sem_wait(&(gsem[me])) ,它应该等到特定进程被唤醒。 但是,由于某种原因,它给了我错误的Bad file descriptor 。 我sem_wait了一下sem_wait ,Open Group规范说这不是sem_wait可能导致的错误。 这让我的整个程序变得疯狂,我不知道为什么会失败。 编辑:违规代码,根据要求。 120 sem_wait(&mutex); 121 if (inside[opp] > 0 || waiting[opp] > 0) { 122 sem_wait(&screen); 123 printf(“%s %u waiting\n”, names[me], t); 124 sem_post(&screen); 125 waiting[me]++; 126 sem_post(&mutex); 127 int hg = sem_wait(&(gsem[me])); 128 if (hg < 0) 129 printf("%s\n", strerror(errno)); 130 } […]

fork(),多个孩子的问题

我编辑了一下: for ( ii = 0; ii < nbEnfants; ++ii) { switch (fork()){ case -1 : { printf("\n\nSoucis avec fork() !!! \n\n"); exit(0); }; case 0 : { EEcrireMp(ii); }break; default : { tabPidEnfants[ii] = p; usleep(50000); ELireMp(nbSect, nbEnfants,tabPidEnfants); }; } } 我的问题:我遇到了很多孩子,就像孩子产卵的炸弹一样。 我怎么能阻止那些孩子? rest应该阻止它吗? 谢谢

如何在C中的共享内存中创建信号量?

我的任务是创建两个不同的C文件,然后使用信号量进行进程同步(我同时运行两个C文件)。 我主要担心的是:如果我想在两个进程中访问信号量(C文件的可执行文件),我需要在共享内存中创建信号量。 我还需要创建二进制信号量。 因为这是我的第一个程序,有人可以建议如何开始这个吗? 我能够创建和使用共享内存,在线程中使用信号量。 我在YouTube上观看了一些讲座,但找不到合适的解决方案。

如何保护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睡眠可以解决同步问题吗?

此解决方案中的信号量使用是否正确?

问题:我必须增加x1和x2变量,这应该由不同的线程完成,并且在两个变量的上一个增量都没有完成之前,不应该调用两个变量的下一个增量。 建议的解决方案:初始化4个信号量并调用单独的线程以单独增加变量。 2个信号量,用于将消息传递给线程以开始递增; 2个信号量,用于将消息传递到主线程,以完成递增。 主线程将等待来自两个子线程的信号量发布,显示两个变量的增量完成,然后主线程将消息传递给两个子线程,允许进一步递增。 这个目前对我来说很好。 但是,一个人能提出更好的解决方案吗? 或者,任何人都可以在此解决方案中指出问题吗? 任何帮助将不胜感激? 提前致谢。 解决方案代码 #include #include #include //Threads pthread_t pth1,pth2; //Values to calculate int x1 = 0, x2 = 0; sem_t c1,c2,c3,c4; void *threadfunc1(void *parm) { for (;;) { x1++; sem_post(&c1); sem_wait(&c3); } return NULL ; } void *threadfunc2(void *parm) { for (;;) { x2++; sem_post(&c2); sem_wait(&c4); } […]

信号量和并发编程

对于家庭作业,我需要编写以下场景。 这将使用BACI(即C–)使用信号量完成 有2个男女皆宜的洗手间,每个可容纳4人。 由于它是男女皆宜的,只有同性别的人可以同时进入洗手间,而FIFO并不重要。 我有一个基本的“算法”在我的头脑中处理4个男人和4个女人为1个厕所。 但我不知道如何编码。 任何帮助将不胜感激。 这就是我所拥有的。 Woman: Check to see if there are any men in the restroom. If so “wait”. If no men check to see if there are 4 people. If so “wait”. If no men and not 4 use restroom. When leaving signal there is a vacancy. If last woman […]