我在让Semaphores在C语言系统上工作时遇到了很多困难.
我的申请流程如下:
sem_open一个通用名称来打开信号量.如果我在分叉之前创建信号量,它可以正常工作.但是,要求阻止我这样做.当我sem_open第二次尝试呼叫时,我收到"权限被拒绝"错误(通过errno).
是否有可能以任何方式做到这一点?或者有没有办法在一个进程中打开信号量并使用共享内存机制与子进程共享它?
AFAIK,在LDD3(Linux设备驱动程序第3版)编写完成后,mutex API被引入内核,所以书中没有对它进行描述.
该书描述了如何将内核的信号量API用于互斥功能.
它建议使用down_interruptable()而不是down():
作为一般规则,您不希望使用不间断操作,除非确实没有其他选择.不可中断的操作是创建不可杀死进程的好方法(在ps中看到可怕的"D状态"),并且惹恼用户[Linux设备驱动程序第3版]
现在.这是我的问题:
互斥锁API有两个"相似"功能:
mutex_lock_killable()一mutex_lock_interruptable().我应该选择哪一个?
有没有办法从主线程同步查询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 …
我正在编写一个模仿电影院的多线程应用程序.涉及的每个人都是自己的线程,并发必须完全由信号量完成.我唯一的问题是如何基本上链接线程,以便他们可以通信(例如通过管道).
例如:
客户[1]是一个线程,获取一个信号量,让它走向票房.现在,客户[1]必须告诉票房代理他们想要看电影"X".然后BoxOfficeAgent [1]也是一个线程,必须检查以确保电影未满,并且要么卖票,要么告诉客户[1]选择另一部电影.
如何在保持与信号量的并发性的同时来回传递数据?
另外,我可以在java.util.concurrent中使用的唯一类是Semaphore类.
这是我的问题:我有一个脚本(让我们称之为comet.php)由AJAX客户端脚本提供,并等待更改发生如下:
while(no_changes){
usleep(100000);
//check for changes
}
Run Code Online (Sandbox Code Playgroud)
我不太喜欢这个,它不是很可扩展,它是(imho)"糟糕的做法"我想用信号量(?)或无论如何并发编程技术来改善这种行为.你能告诉我一些如何处理这个问题的技巧吗?(我知道,这不是一个简短的答案,但一个起点就足够了.)
编辑:LibEvent怎么样?
我正在尝试调解一个小的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,但是还有另外一个问题 - …
我必须使用Java信号量解决这个问题,但我不知道如何,我找不到任何相关的Java资料.这是怎么回事:
有各种各样的线索:男人和女人.两者都想使用数量为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)
我也有 …
我有两个进程A和B. A和B有时需要进行通信(双向)以传递信号,消息等.
我已经对Linux中可用的IPC进行了一些基础研究,如信号量,消息队列,dbus等.
现在我是在决定使用哪一个时很困惑,谁能告诉我哪个IPC更适合我的应用?
提前致谢
编辑:阐述应用程序.(这是一个嵌入式应用程序)
过程A将监控温度,速度计算等.过程B将驱动电机,读取传感器值(数字)等.有时我需要将信号发送到过程B告知达到最高温度,所以停止驱动电机.有时需要将从流程A中的传感器读取的数据发送到流程B.像这样,需要在流程中传递数字数据.我在ARM架构中这样做.
任何解释每个的实时场景都将受到赞赏.除了pthreads之外还有其他方法来处理同步.互斥体与递归互斥体(任何实时场景)有何不同?