标签: semaphore

线程和简单的死锁治愈

使用互斥锁和信号量处理线程(特别是在C++中)时,有一个简单的经验法则可以避免死锁并具有良好的干净同步效果吗?

c++ synchronization mutex deadlock semaphore

9
推荐指数
2
解决办法
3591
查看次数

使用Semaphores的程序在Linux上运行良好...在Mac OSX上出现意外结果

我写了一个简单的程序,使用信号量解决了Readers-Writers问题.它在Linux操作系统上完美运行,但是当我在我的Mac OSX上运行时,我得到了意想不到的结果,我无法弄清楚原因.

我的计划:

#include <semaphore.h>
#include <sys/types.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void* function1(void* val);
void* function2(void* val);

// shared values
volatile int X;
volatile int Y;

// declare semaphores
sem_t s1;
sem_t s2;

main()
{
void* status;

pthread_t thread1;
pthread_t thread2;
srand(time(NULL));

// initialize semaphores to zero
sem_init(&s1, 0, 0);
sem_init(&s2, 0, 0);

pthread_create(&thread1, NULL, function1, NULL);
pthread_create(&thread2, NULL, function2, NULL);

pthread_join(thread1, &status);
pthread_join(thread2, &status);

sem_destroy(&s1);
sem_destroy(&s2);

}

void* function1(void* val)
{
   while(1)
   {
   X = rand()%1000; // …
Run Code Online (Sandbox Code Playgroud)

c macos synchronization semaphore

9
推荐指数
1
解决办法
2万
查看次数

如何在C中初始化二进制信号量

手册页中,即使您将信号量初始化为值1,也会显示:

sem_init(&mySem, 0, 1);
Run Code Online (Sandbox Code Playgroud)

多次调用时,它仍然可以增加到大于1的值

sem_post(&mySem);
Run Code Online (Sandbox Code Playgroud)

但在这个代码示例中,注释似乎有不同的看法:

sem_init(&mutex, 0, 1);      /* initialize mutex to 1 - binary semaphore */
Run Code Online (Sandbox Code Playgroud)

是否可以在C中初始化严格的二进制信号量?

注意:在这种情况下执行此操作而不是使用互斥锁的原因是sem_post和sem_wait可能由不同的线程调用.

c linux semaphore init

9
推荐指数
1
解决办法
2万
查看次数

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

我想要一些关于互斥和信号量的澄清.
我的问题是,

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

c multithreading mutex semaphore pthreads

9
推荐指数
2
解决办法
2万
查看次数

使用信号量和pthreads的Producer Consumer程序

我已经为生产者 - 消费者问题写了一个代码.但是我没有得到输出.没有编译错误,但在我的程序中发出警告.我很困惑.非常努力.但是无法得到它.请告诉我什么我的程序是错的.什么是正确的程序.我感到沮丧.请帮助伙计们.这是代码 -

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include </usr/include/semaphore.h>

#define BUFF_SIZE   5           /* total number of slots */
#define NP          3           /* total number of producers */
#define NC          3           /* total number of consumers */
#define NITERS      4           /* number of items produced/consumed */

typedef struct {
    int buf[BUFF_SIZE];   /* shared var */
    int in;               /* buf[in%BUFF_SIZE] is the first empty slot */
    int out;              /* buf[out%BUFF_SIZE] is the first full slot */
    sem_t full;           /* …
Run Code Online (Sandbox Code Playgroud)

c semaphore pthreads

9
推荐指数
1
解决办法
6万
查看次数

Go中的惯用可变大小工作池

我正试图在Go中实现一个工作池.在去维基(和有效的围棋频道部分)功能限制资源利用的很好的例子.只需创建一个具有与工作池一样大的缓冲区的通道.然后用工人填充该频道,并在完成后将其发送回频道.从通道块接收,直到工作人员可用.所以频道和循环是整个实现 - 非常酷!

或者,可以阻止发送到频道,但同样的想法.

我的问题是在工作池运行时改变它的大小.我不相信有办法改变频道的大小.我有一些想法,但大多数看起来都太复杂了. 这个页面实际上使用一个通道和空结构以大致相同的方式实现了一个信号量,但它有同样的问题(这些东西一直在谷歌搜索"golang信号量".

concurrency semaphore worker-process go goroutine

9
推荐指数
1
解决办法
6598
查看次数

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

我的任务是创建两个不同的C文件,然后使用信号量进行进程同步(我同时运行两个C文件).

我主要担心的是:如果我想在两个进程中访问信号量(C文件的可执行文件),我需要在共享内存中创建信号量.我还需要创建二进制信号量.

因为这是我的第一个程序,有人可以建议如何开始这个吗?

我能够创建和使用共享内存,在线程中使用信号量.我在YouTube上看了一些讲座,但找不到合适的解决方案.

c semaphore shared-memory

9
推荐指数
2
解决办法
1万
查看次数

等待任务完成而不阻止UI线程

我有一个相当复杂的WPF应用程序(很像VS2013)IDocuments并且ITools停靠在应用程序的主shell中.Tools当主窗口关闭时,其中一个需要安全关闭,以避免进入"坏"状态.所以我使用Caliburn Micro的public override void CanClose(Action<bool> callback)方法来执行一些数据库更新等.我遇到的问题是这个方法中的所有更新代码都使用MongoDB Driver 2.0,这个东西是async.一些代码; 目前我正在尝试表演

public override void CanClose(Action<bool> callback)
{
    if (BackTestCollection.Any(bt => bt.TestStatus == TestStatus.Running))
    {
        using (ManualResetEventSlim tareDownCompleted = new ManualResetEventSlim(false))
        {
            // Update running test.
            Task.Run(async () =>
                {
                    StatusMessage = "Stopping running backtest...";
                    await SaveBackTestEventsAsync(SelectedBackTest);
                    Log.Trace(String.Format(
                        "Shutdown requested: saved backtest \"{0}\" with events",
                        SelectedBackTest.Name));

                    this.source = new CancellationTokenSource();
                    this.token = this.source.Token;
                    var filter = Builders<BsonDocument>.Filter.Eq(
                        BackTestFields.ID, DocIdSerializer.Write(SelectedBackTest.Id));
                    var update = Builders<BsonDocument>.Update.Set(BackTestFields.STATUS, …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous semaphore task blocking

9
推荐指数
2
解决办法
6885
查看次数

Java - 信号量的优先级

我有多个线程访问外部资源 - 一个broswer.但是一次只能有一个线程访问它.所以,我正在使用信号量来同步它们.但是,一个线程从GUI获取输入然后访问浏览器以获得结果,应优先于其他线程,我不知道如何使用信号量来实现它.

我认为获取信号量后的每个线程都会检查队列中是否有优先级线程等待,如果是,则将其释放并再次等待.只有优先级线程在获取后才会释放它.

这是一个很好的解决方案还是我可以使用Java API中的其他任何东西?

java multithreading semaphore

9
推荐指数
2
解决办法
2295
查看次数

为什么 sem_wait 在中断时不会解除阻塞(并返回 -1)?

我有一个使用sem_wait. 该POSIX规范说:

sem_wait()功能可通过信号传送中断。

此外,在关于错误的部分中,它说:

[EINTR] - 一个信号中断了这个功能。

但是,在我的程序中,发送信号不会解除调用的阻塞(并-1按照规范中的指示返回)。

一个最小的例子可以在下面找到。该程序sem_wait在发送信号后挂起并且永远不会解除阻塞。

#include <semaphore.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

sem_t sem;

void sighandler(int sig) {
  printf("Inside sighandler\n");
}

void *thread_listen(void *arg) {
  signal(SIGUSR1, &sighandler);
  printf("sem_wait = %d\n", sem_wait(&sem));
  return NULL;
}

int main(void) {

  pthread_t thread;

  sem_init(&sem, 0, 0); 

  pthread_create(&thread, NULL, &thread_listen, NULL);

  sleep(1);
  raise(SIGUSR1);

  pthread_join(thread, NULL);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

程序输出Inside sighandler然后挂起。

还有另外一个问题在这里关于这一点,但它并没有真正提供任何清晰。

我误解了规范所说的内容吗?仅供参考,我的电脑使用 Ubuntu GLIBC …

c semaphore pthreads interrupt interrupt-handling

9
推荐指数
2
解决办法
456
查看次数