标签: semaphore

如何在C中使用sem_open进行多次调用?

我在让Semaphores在C语言系统上工作时遇到了很多困难.

我的申请流程如下:

  1. 申请开始
  2. 申请分叉到孩子/父母
  3. 每个进程使用sem_open一个通用名称来打开信号量.

如果我在分叉之前创建信号量,它可以正常工作.但是,要求阻止我这样做.当我sem_open第二次尝试呼叫时,我收到"权限被拒绝"错误(通过errno).

是否有可能以任何方式做到这一点?或者有没有办法在一个进程中打开信号量并使用共享内存机制与子进程共享它?

c linux semaphore

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

我应该在Linux内核开发中使用哪种互斥锁变体?

AFAIK,在LDD3(Linux设备驱动程序第3版)编写完成后,mutex API被引入内核,所以书中没有对它进行描述.

该书描述了如何将内核的信号量API用于互斥功能.

它建议使用down_interruptable()而不是down():

作为一般规则,您不希望使用不间断操作,除非确实没有其他选择.不可中断的操作是创建不可杀死进程的好方法(在ps中看到可怕的"D状态"),并且惹恼用户[Linux设备驱动程序第3版]

现在.这是我的问题:

互斥锁API有两个"相似"功能: mutex_lock_killable()mutex_lock_interruptable().我应该选择哪一个?

mutex semaphore linux-kernel

8
推荐指数
1
解决办法
3704
查看次数

WKWebView:尝试从主线程同步查询javascript

有没有办法从主线程同步查询javascript?

使用具有回调参数的异步函数从本机代码查询Javascript以处理响应:

func evaluateJavaScript(_ javaScriptString: String, completionHandler completionHandler: ((AnyObject!, NSError!) -> Void)?)
Run Code Online (Sandbox Code Playgroud)

通过暂停线程并使用信号量控制执行,通常可以将异步行为转为同步:

// Executing in the main thread
let sema = dispatch_semaphore_create(0)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
// Background thread
  self.evaluateJavaScript("navigator.userAgent", completionHandler: { (value:AnyObject!, error: NSError!) -> Void in
    if let ua = value as? String {
      userAgent = ua
    } else {
      ERROR("ERROR There was an error retrieving the default user agent, using hardcoded value \(error)")
    }
    dispatch_semaphore_signal(sema)
  })
}
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)
Run Code Online (Sandbox Code Playgroud)

然而......在这种情况下,因为completionHandler一直被称为主线程,代码死锁,因为completionHandler块永远不会执行(主线程暂停由dispatch_semaphore_wait …

semaphore grand-central-dispatch ios ios8 wkwebview

8
推荐指数
1
解决办法
3342
查看次数

信号量满足有限的等待

信号量是否满足有限的等待或它们只是为了提供互斥?

semaphore

7
推荐指数
1
解决办法
1933
查看次数

使用Java在线程之间管道数据

我正在编写一个模仿电影院的多线程应用程序.涉及的每个人都是自己的线程,并发必须完全由信号量完成.我唯一的问题是如何基本上链接线程,以便他们可以通信(例如通过管道).

例如:

客户[1]是一个线程,获取一个信号量,让它走向票房.现在,客户[1]必须告诉票房代理他们想要看电影"X".然后BoxOfficeAgent [1]也是一个线程,必须检查以确保电影未满,并且要么卖票,要么告诉客户[1]选择另一部电影.

如何在保持与信号量的并发性的同时来回传递数据?

另外,我可以在java.util.concurrent中使用的唯一类是Semaphore类.

java multithreading semaphore piping

7
推荐指数
1
解决办法
6770
查看次数

如何在PHP中实现事件监听

这是我的问题:我有一个脚本(让我们称之为comet.php)由AJAX客户端脚本提供,并等待更改发生如下:

while(no_changes){
    usleep(100000);
    //check for changes
}
Run Code Online (Sandbox Code Playgroud)

我不太喜欢这个,它不是很可扩展,它是(imho)"糟糕的做法"我想用信号量(?)或无论如何并发编程技术来改善这种行为.你能告诉我一些如何处理这个问题的技巧吗?(我知道,这不是一个简短的答案,但一个起点就足够了.)

编辑:LibEvent怎么样?

php concurrency semaphore comet reverse-ajax

7
推荐指数
1
解决办法
5910
查看次数

Windows服务无法看到命名信号量

我正在尝试调解一个小的Windows服务,使其在启动期间等待来自另一个进程的信号.当然,我知道这种方法可能(甚至会)有时会导致服务启动超时.事实并非如此.

问题是名为System.Thread.Sempaphore我用于调解目的.使用以下构造在其他地方创建和获取信号量.没有更改GC有它,因为我明确地在给定的行下方执行测试以进行测试.

Boolean newOne;
System.Threading.Semaphore rootSemaphore = 
    new System.Threading.Semaphore(1, 1, "DummyServiceSemaphore", out newOne);
Run Code Online (Sandbox Code Playgroud)

上面的代码显然效果很好.以下代码在调试模式或控制台应用程序下执行时效果很好:

Boolean createdNew;
System.Threading.Semaphore semaphore = 
    new System.Threading.Semaphore(1, 1, "DummyServiceSemaphore", out createdNew);
if (createdNew) 
    throw new Exception("That's not what we wanted");
Run Code Online (Sandbox Code Playgroud)

作为Windows服务的一部分执行时,完全相同的代码失败:

static class Program
{
    static void Main(string[] args)
    {
        Boolean createdNew;
        System.Threading.Semaphore semaphore = 
            new System.Threading.Semaphore(1, 1, "DummyServiceSemaphore", out createdNew);
        if (createdNew) 
            throw new Exception("That's not what we wanted");

        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new Dummy() };
        ServiceBase.Run(ServicesToRun);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,请寻求帮助.

PS:我一直在尝试使用Mutex,但是还有另外一个问题 - …

c# windows-services semaphore

7
推荐指数
1
解决办法
2703
查看次数

Java男女皆宜的浴室

我必须使用Java信号量解决这个问题,但我不知道如何,我找不到任何相关的Java资料.这是怎么回事:

有各种各样的线索:男人和女人.两者都想使用数量为BATHROOM_SIZE的相同资源.5条规则:

  1. 在信令需要使用资源之后,每个线程都应该等到他能够使用它.
  2. 当多个BATHOOM_SIZE线程同时使用资源时,防止出现这种情况.
  3. 防止女人和男人同时使用浴室.
  4. 线程应该同时使用资源.如果有一种类型的线程很多,那么BATHROOM_SIZE线程应该使用资源.
  5. 防止饥饿.

结果

效劳于:

1女,1人,5女,5人

失败:

5women1men,5men1women,2men2women,5men5women.

自从星期一以来我一直在努力使它成功,现在我的想法已经用完了.

所以我的任务是编写实现BathroomInterface的Bathroom.java类:

public interface BathroomInterface {

    public static final int BATHROOM_SIZE = 3; //3 is just example
    void manEnter();
    void manExit();
    void womanEnter();
    void womanExit();
}
Run Code Online (Sandbox Code Playgroud)

在系统中有许多男人和女人的线程像这样工作:

for(int i = 0; i < n; i++) {
  bathroom.manEnter();
  //uses bathroom random amount of time
  bathroom.manExit();
}

for(int i = 0; i < m; i++) {
  bathroom.womanEnter();
  //uses bathroom random amount of time
  bathroom.womanExit();
}
Run Code Online (Sandbox Code Playgroud)

我也有 …

java multithreading semaphore

7
推荐指数
1
解决办法
4252
查看次数

Linux IPC选择?

我有两个进程A和B. A和B有时需要进行通信(双向)以传递信号,消息等.
我已经对Linux中可用的IPC进行了一些基础研究,如信号量,消息队列,dbus等.
现在我是在决定使用哪一个时很困惑,谁能告诉我哪个IPC更适合我的应用?

提前致谢

编辑:阐述应用程序.(这是一个嵌入式应用程序)
过程A将监控温度,速度计算等.过程B将驱动电机,读取传感器值(数字)等.有时我需要将信号发送到过程B告知达到最高温度,所以停止驱动电机.有时需要将从流程A中的传感器读取的数据发送到流程B.像这样,需要在流程中传递数字数据.我在ARM架构中这样做.

linux semaphore ipc dbus message-queue

7
推荐指数
1
解决办法
3615
查看次数

互斥锁,信号量和读写锁之间有什么区别

任何解释每个的实时场景都将受到赞赏.除了pthreads之外还有其他方法来处理同步.互斥体与递归互斥体(任何实时场景)有何不同?

mutex semaphore readerwriterlock

7
推荐指数
2
解决办法
7309
查看次数