我正在阅读 Galvin 的操作系统概念。在信号量部分,它说在修改信号量的值时必须禁用对处理器的所有中断。 为什么需要它?
为了并发性和确保数据的完整性,如何获得给定对象的互斥锁?您是否需要在数据库或文件中使用锁定,或者 PHP 是否支持类似的操作?
我对二叉树中的Peterson算法有些怀疑.
我正在做一些关于"多处理器编程的艺术"一书的练习,我被困在第2章,前13:
"推广双线程Peterson锁的另一种方法是在二叉树中安排一些2线程的Peterson锁.假设n是2的幂.每个线程被分配一个叶子锁,它与另一个线程共享.每个锁将一个线程视为线程0,另一个线程视为线程1."
没关系,但是什么?如果Peterson只处理2个线程,这棵树怎么样?一棵树有一片叶子?(因为如果我有2个线程,并且每个叶子处理2个线程......结果将是一个带有单个叶子的树?)
"在树锁的获取方法中,线程获取每个双线程的Peterson锁从该线程的叶子到根.树锁的释放方法解锁了线程获取的每个2线程Peterson锁,来自根回到它的叶子."
他的意思是什么?叶子如何通过根节点?非常困惑!!:S
感谢你们!
我指的是这里描述的监视器:
http://en.wikipedia.org/wiki/Monitor_(synchronization)
这里没有一个定义似乎适用:
http://www.thefreedictionary.com/monitor
那他们为什么这么称呼呢?
==更新==
谢谢大家的答案!
我想我很困惑,因为我不认为监视器通常是对自己采取行动,这似乎是在这里发生的事情.例如,您使用婴儿监视器监视婴儿.我只是觉得宝宝监视自己没有多大意义,但我可能错了.
concurrency multithreading synchronization monitor mutual-exclusion
使用lock语句,可以"确保一个线程不进入代码的关键部分而另一个线程在关键部分.如果另一个线程试图输入锁定的代码,它将等待,阻塞,直到该对象被释放".
如果我想要的行为是,如果另一个线程试图输入锁定的代码,它将跳过整个代码(而不是等待锁被释放)怎么办?我想到的一个想法就是使用旗帜,比如说
if(flag) return;
flag = true;
//do stuff here
flag =false;
Run Code Online (Sandbox Code Playgroud)
但我知道这不安全,因为两个线程可以在任何人设置为true之前传递第一行,或者如果异常情况下该标志永远不会设置为false.你能提出改进或替代吗?
我为我的项目制作了一个手工制作的互斥锁,但我怀疑它是否是线程安全的......
bool blocked;
while ( blocked )
{
}
blocked = true;
...
blocked = false;
Run Code Online (Sandbox Code Playgroud)
可以说,线程A传递while循环并且没有及时阻塞标志(没有时间将标志设置为false
),线程B也通过while循环!
可能吗?为什么?
正如我所知,互斥体具有完全相同的工作原理.为什么不能在互斥锁中发生这种情况?我读过有关这不能被中断的原子操作......所以check-if-mutex-available
并mutex-block
不能中断,对不对?
我有一个程序需要有一个选项来测试服务器 ID 列表或对服务器发出命令。这意味着,如果我发出--test
,则不需要其他任何东西。它对每台服务器运行全部测试并打印结果。
但是,如果我不指定--test
,那么它应该需要一些选项,例如--id
和--command
。
但是,我不确定是否argparse
可以处理互斥组中所需的选项。代码(为简单起见进行了修改)如下。我已经修改了这些选项,因此如果您指定-a
,那么您应该可以开始,并且不需要其他选项。
import argparse
parser = argparse.ArgumentParser()
test_or_not = parser.add_mutually_exclusive_group(required=True)
test_or_not.add_argument('-a', action='store_true')
or_not = test_or_not.add_argument_group()
target = or_not.add_mutually_exclusive_group(required=True)
target.add_argument('-b',action="store_true")
target.add_argument('-c',action="store_true")
target.add_argument('-d',action="store_true")
target.add_argument('-e',action="store_true")
group = or_not.add_mutually_exclusive_group(required=True)
group.add_argument('-f',action="store_true")
group.add_argument('-g',action="store_true")
or_not.add_argument('-i',action="store_true")
or_not.add_argument('-j',action="store_true")
or_not.add_argument('-k',action="store_true")
or_not.add_argument('-l',action="store_true")
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
产生结果错误的原因argparse
是仍然需要单独的选项,即使它们位于互斥的组中。有没有一种方法argparse
可以适应这组选项,或者我是否需要在之外添加一些编程argparse
?
$ python3 ~/tmp/groups.py -a
usage: groups.py [-h] -a (-b | -c | -d | -e) (-f | -g) [-i] [-j] [-k] [-l] …
Run Code Online (Sandbox Code Playgroud) 我已经在共享内存中实现了彼得森的互斥算法。我在 c++ 和 java 进程(使用 jni)之间使用共享内存进行通信。问题是我仍然以某种方式看到竞争条件。如果我尝试使用 printf/println 调试它,代码开始运行良好,但是一旦我删除这些打印件,进程就会停止。有人可以请教我问题出在哪里吗?我很确定彼得森算法的实现是正确的。我应该使用 semaphores(semget()) 来代替互斥吗?
c++ java-native-interface locking shared-memory mutual-exclusion
这种相互排斥的模式是否像我认为的那样安全?如果是这样,你怎么称呼它?
lock (_lock) {
if (_flag) return;
else _flag = true;
}
try {
//critical code...
}
finally {
_flag = false;
}
Run Code Online (Sandbox Code Playgroud)
我想确保关键部分,但没有其他线程堆积等待获取锁定.显然,我确保标志设置在其他地方.有没有更好的办法?
我有一个包含a BYTE*
,一个引用计数器的类,CRITICAL_SECTION
它保护它们不受并发访问的影响.
我想用一个替换所有这些std::tr1::shared_ptr<BYTE>
.在MSDN说:
多个线程可以同时读写不同的shared_ptr对象,即使这些对象是共享所有权的副本也是如此.
一切听起来都没问题,直到我发现CRITICAL_SECTION
课堂外的东西用来"锁定"它并以互相排斥的方式改变它的内容.好吧,它打破了封装,我想改变它.
我知道shared_ptr
保证内存将被释放,但是当你写入内存时它是否保证互斥?
mutual-exclusion ×10
concurrency ×4
c++ ×3
locking ×3
.net ×2
c# ×2
algorithm ×1
argparse ×1
atomic ×1
monitor ×1
mutex ×1
php ×1
python ×1
python-3.x ×1
semaphore ×1
shared-ptr ×1
windows ×1