这是一个面试问题.
是否可以在Linux/UNIX上的多处理案例中使用互斥?
我的想法:不,不同的进程有独立的内存空间.
mutex仅用于多线程.
信号量用于多处理以进行同步.
对 ?
欢迎任何评论.
谢谢
multithreading synchronization mutex semaphore multiprocessing
我有以下代码,信号量不会按预期锁定它.
(我知道apc_inc.这不是我想要的.)
$semkey = sem_get(123);
sem_acquire($semkey);
$count = apc_fetch('count111');
if(!$count) $count = 0;
$count++;
apc_store('count111', $count);
sem_release($semkey);
Run Code Online (Sandbox Code Playgroud)
其次是
ab -n 4000 -c 200 http://localhost/test.php
0请求失败.
但之后apc_fetch('count111')只显示了~1200次点击
nginx on ubuntu 12.04(64bit),php 5.3.16~dotdeb,php-fpm
也许现在已经太晚了,但我想不出一个很好的方法来做到这一点.
我已经开始了一堆异步下载,我想等到它们都在程序终止之前完成.这让我相信我应该在下载开始时增加一些东西,并在它完成时减少它.但那我怎么等到计数再次为0?
信号量以相反的方式工作,因为当没有可用资源时阻塞,而不是当它们全部可用时阻塞(当count为0而不是非零时为块).
我想分叉多个进程,然后在它们上使用信号量.这是我尝试过的:
sem_init(&sem, 1, 1); /* semaphore*, pshared, value */
.
.
.
if(pid != 0){ /* parent process */
wait(NULL); /* wait all child processes */
printf("\nParent: All children have exited.\n");
.
.
/* cleanup semaphores */
sem_destroy(&sem);
exit(0);
}
else{ /* child process */
sem_wait(&sem); /* P operation */
printf(" Child(%d) is in critical section.\n",i);
sleep(1);
*p += i%3; /* increment *p by 0, 1 or 2 based on i */
printf(" Child(%d) new value of *p=%d.\n",i,*p);
sem_post(&sem); /* …Run Code Online (Sandbox Code Playgroud) 在阅读Java中的并发性时,我有以下疑问:
Java是否提供较低级别的构造然后同步以进行同步?
在什么情况下我们会使用信号量而不是synchronized(它在Java中提供监视器行为)
我正在用IPC进行实验,特别是使用Mutex,Semaphore和Spin Lock.我学到的是Mutex用于异步锁定(具有睡眠(根据我在NET上读到的理论))机制,信号量是同步锁定(具有信号和睡眠)机制,并且自旋锁是同步但非睡眠机制.
任何人都可以帮我澄清这些东西吗?另一个疑问是关于Mutex,当我用线程和互斥体编写程序时,一个线程正在运行另一个线程不处于Sleep状态但它不断尝试获取Lock.所以Mutex正在睡觉或不睡觉???
是否可以在用户空间和内核空间之间共享信号量(或任何其他同步锁)?命名的POSIX信号量具有内核持久性,这就是为什么我想知道是否有可能从内核上下文创建和/或访问它们.
由于有关正常使用POSIX信号量的大量信息,搜索互联网并没有多大帮助.
我正在为实时系统开发一个统一的界面,我在其中添加了一些书籍,由信号量保护.这些书籍保留是在资源分配和解除分配上完成的,这是在非实时环境中完成的.
使用RTAI,等待和发布信号量的线程需要处于实时上下文中.这意味着使用RTAI的命名信号量意味着在用户空间中的每个等待/发布之间切换实时和非实时上下文,更糟糕的是,为内核空间中的每个sem/wait创建一个短实时线程.
我正在寻找的是一种在内核和用户空间之间共享正常Linux或POSIX信号量的方法,这样我就可以安全地在非实时环境中等待/发布它.
任何有关此主题的信息将不胜感激.如果这是不可能的,你还有其他任何想法如何完成这项任务?1
1一种方法是添加系统调用,在内核空间中具有信号量,并让用户空间进程调用该系统调用,并且信号量将全部在内核空间中进行管理.如果我不是因为这个而不必修补内核,我会更高兴.
我需要什么以及如何在Windows Vista上使用C语言中的线程?
你能给我一个简单的代码示例吗?
根据文件:
"a
SemaphoreSlim不使用Windows内核信号量".
是否有任何特殊资源SemaphoreSlim使得Dispose在SemaphoreSlim不再使用遗嘱时呼叫很重要?
C#中的互斥锁和信号量是什么?我们需要实施的地方?
我们如何在多线程中与他们合作?