我有两个用例.
答:我想将两个线程的访问同步到队列.
B.我想将两个线程的访问同步到队列并使用条件变量,因为其中一个线程将等待内容由另一个线程存储到队列中.
对于用例AI,请参阅代码示例std::lock_guard<>
.对于用例BI,请参阅使用的代码示例std::unique_lock<>
.
两者之间有什么区别,我应该在哪个用例中使用哪一个?
是否有Pythonic方法只运行一个程序实例?
我提出的唯一合理的解决方案是尝试在某个端口上将其作为服务器运行,然后第二个程序尝试绑定到同一个端口 - 失败.但这不是一个好主意,也许有比这更轻巧的东西?
(考虑到程序有时会失败,即段错误 - 所以像"锁定文件"这样的东西不起作用)
更新:提供的解决方案比仅存在一个不存在的服务器的端口要复杂得多且不太依赖,所以我必须使用那个.
什么时候应该使用信号量,什么时候应该使用条件变量(CondVar)?
multithreading synchronization operating-system semaphore mutual-exclusion
我正在使用旋转锁来保护非常小的关键部分.争用情况非常罕见所以自旋锁是比常规的互斥体更合适.
我目前的代码如下,并假设x86和GCC:
volatile int exclusion = 0;
void lock() {
while (__sync_lock_test_and_set(&exclusion, 1)) {
// Do nothing. This GCC builtin instruction
// ensures memory barrier.
}
}
void unlock() {
__sync_synchronize(); // Memory barrier.
exclusion = 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道:
__sync_lock_release
.我不是记忆障碍的专家,所以我不确定我是否可以使用它而不是__sync_synchronize
.我不在乎在所有有关争.有可能是1,也许2其他线程试图每过一次锁自旋锁天.
有几种方法可以做到这一点,但我不确定哪一种是最好的.
这是我能想到的:
可能有更多方法可以做到这一点.您认为最好的方法是什么?
阅读一些关于在PHP中锁定的文章.
它们主要指向http://php.net/manual/en/function.flock.php.
这个页面讨论了在硬盘上打开文件!!
真的是这样吗?我的意思是,这使得锁定非常昂贵 - 这意味着每次我想要锁定我都必须访问硬盘)=
可以用一个令人愉快的消息来安慰我吗?
编辑:
由于我有一些回复,我想问这个;
我的脚本只能运行一个或几个线程?因为如果它是一个然后我显然不需要互斥量.有简明的答案吗?
究竟我想要做什么
由ircmaxell提问.
这是故事:
我有两个ftp服务器.我希望能够在我的网站上显示有多少在线用户在线.
所以,我认为这些ftp服务器会将他们的统计信息"POST"到某个PHP脚本页面.我们假设此页面的URL是" http://mydomain.com/update.php ".
在网站的主页(" http://mydomain.com/index.php ")上,我将显示累积统计信息(在线用户).
而已.
我的问题是,我不确定当一个ftp服务器更新他的统计数据而另一个ftp服务器也是如此时,信息会变得混杂.
就像多线程时一样; 两个线程同时增加一些"int"变量.除非您在它们之间进行同步,否则它不会按预期发生.
那么,我有问题吗?是的,不,也许吧?
可能解决方案
一整天都在努力思考,我在这里有一个想法,我想让你发表意见.
正如所说的这些ftp服务器将发布他们的统计数据,每60秒一次.
我正在考虑将此文件设为"stats.php".
它将包含在ftp服务器转到的更新脚本("update.php")和"index.php"页面中,访问者可以看到有多少用户在线.
现在,当ftp服务器更新时,"update.php"中的脚本将使用新的累积统计信息修改"stats.php".
首先,它将读取"stats.php"中包含的统计信息,然后累积,然后重写该文件.
如果我没弄错,PHP将检测到文件("stats.php")已更改并加载新文件.正确?
Silberschatz,Galvin和Gagne的"操作系统原理"一书包含有关同步章节中TestAndSet()指令的以下定义:
boolean TestAndSet(boolean *target) {
boolean rv = *target;
*target = TRUE;
return rv;
}
Run Code Online (Sandbox Code Playgroud)
使用上述指示实现互斥也如下:
do {
while(TestAndSetLock(&lock))
; // do nothing
// critical section
lock = FALSE;
// remainder section
} while(TRUE);
Run Code Online (Sandbox Code Playgroud)
现在,如果没有将目标设置为TRUE的条件,如何实现互斥?
考虑以下情况,进程P0将共享变量锁设置为TRUE并进入其临界区.另一个进程P1在上面的while循环中调用TestAndSet(),它返回TRUE(因为P0具有锁定),同时无条件地将lock设置为FALSE.第二次在while循环中调用TestAndSet()它将返回FALSE并且P1进入其临界区,即使P0处于其临界区.然后违反了相互排斥.
我做了一些搜索,偶然发现了Mithun Acharya和Robert Funderlic(北卡罗来纳州立大学CS系)的论文,其中包含以下TestAndSet()的替代定义:
boolean Test-and-Set(boolean target)
begin
if(target == false):
target = true;
return target;
end
Run Code Online (Sandbox Code Playgroud)
这对我来说更有意义,我把它包括在内进行比较,也因为该论文将Silberschatz的书列为其参考书之一.
我只是不明白我在教科书(我先提供的那本书)中找到的定义如何用于实现相互排斥,任何人都可以帮忙吗?
我有多个线程之间的共享内存.我想阻止这些线程同时访问这段内存.(像生产者 - 消费者问题)
问题:
线程向队列添加元素,另一个线程读取这些元素并删除它们.他们不应该同时访问队列.
该问题的一个解决方案是使用Mutex.
正如我发现的那样,Swift中没有Mutex.Swift还有其他选择吗?
我需要在我的Java应用程序中启动1-3个外部程序,这些程序具有用户定义的路径.我的要求很少:
如果程序已经运行,我不希望程序执行
我不希望任何程序从我的Java应用程序中窃取焦点
我不在乎他们中的任何一个是否未能启动.他们只需要默默地失败.
这是我到目前为止提出的:
ProcessBuilder pb = new ProcessBuilder(userDefinedPath1);
try {
pb.start();
}
catch (Exception e) {
// Something went wrong, just ignore
}
Run Code Online (Sandbox Code Playgroud)
然后我用另外两条路径再重复3次.这开始就像我期望的那样,并且满足我的第三个要求就好了,但是前两个失败了.
做这个的最好方式是什么?
编辑:
我对这些其他应用程序没有任何控制权.他们是第三方.此外,用户可以随时手动启动或停止它们.
我知道可执行文件的确切名称(例如"blah.exe")并且它们将始终相同,但可执行文件的路径不一定如此.
批处理文件包装器在这里是不可行的.
其他应用程序不是 Java应用程序,只是普通的旧Windows可执行文件.