- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有几段代码需要使用互斥锁来保护。问题是代码看起来像这样:
lock(mylockobject) {
if(!foo())
throw new MyException("foo failed");
if(!bar())
throw new MyException("bar failed");
}
使用锁,它可以如我所愿地工作,但现在我需要使用互斥锁。这里明显的问题是,如果我获取互斥量并且 foo() 或 bar() 失败,我将不得不在抛出每个异常之前显式释放互斥量。
在 C++ 中,我会利用在堆栈上创建的对象的作用域,并在对象的构造函数中锁定互斥锁,然后在析构函数中释放它。对于 .NET 的垃圾收集,我认为这行不通。我写了一个测试应用程序并确认如果我做这样的事情:
public class AutoMutex
{
private Mutex _mutex;
public AutoMutex(Mutex mutex)
{
_mutex = mutex;
_mutex.WaitOne();
}
~AutoMutex()
{
_mutex.ReleaseMutex();
}
}
然后有这样的代码:
// some code here...
Mutex my_mutex = new Mutex(false, "MyMutex");
{ // scoping like I would do in C++
AutoMutex test = new AutoMutex(my_mutex);
test = null;
}
析构函数(终结器?)直到很晚才被调用。
Google 尚未为我指出正确的方向,但我仍在努力...请让我知道您如何解决这个小问题,如果可能的话。
最佳答案
对偶点。
1) 您要搜索的是“一次性图案”。要非常小心地正确地实现它。当然,Mutex 已经 实现了一次性模式,所以我不清楚您为什么要自己制作,但了解一下还是有好处的。
有关将一次性模式用作 RAII 是否明智的一些其他想法,请参阅此问题:
2) Try-finally 也有你想要的语义。当然,“using” block 只是 try-finally 的语法糖。
3) 您确定在抛出异常时释放互斥量吗?您确定要扔到保护区内吗?
由于以下原因,这是一种不好的代码味道。
为什么首先要有互斥体?通常是因为模式是这样的:
考虑在“使状态一致”之前抛出异常时会发生什么。 您解锁对状态的访问,该状态现在不一致且陈旧。
保留锁 可能是更好的主意。是的,这意味着有死锁的风险,但至少您的程序不会在垃圾、陈旧、不一致的状态下运行。
从锁定保护区域内抛出异常是一件非常可怕的事情,您应该尽可能避免这样做。从锁内部抛出的异常使您不得不在两种可怕的事情之间做出选择:要么陷入死锁,要么在程序操纵不一致状态时发生疯狂崩溃和不可重现的行为。
您真正应该实现的模式是:
这是更安全的选择,但编写执行此类事务的代码很困难。没有人说多线程很容易。
关于c# - 需要击败 GC 并在对象超出范围后将其销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2201123/
我决定通过访问一个内部变量来解决 GNU libstdc++ 中的一个错误。回想起 Johannes 在他的博客上解决了这个问题,我检查了一下……但无法理解代码,除了获取静态初始化程序来完成肮脏工作的
多年后回到 C++;试图 catch C++11 和 14。我读过右值和移动语义。我以为我理解这个概念。显然不是。我看过几十个例子。但是我根本无法编译我的代码。我一定在示例中遗漏了一些明显的东西。由于
我正在用 celerybeat 运行 django+celery,但出现了这个错误 .../local/lib/python2.7/site-packages/celery/beat.py", lin
我已经阅读了很多关于 CORS/Lambda/AWS API 网关配置的内容,包括 AWS 的设置帮助: http://docs.aws.amazon.com/apigateway/latest/de
在页面加载的 asp.net Web 应用程序中,我获取当前页面 url 并将其存储在 session 变量中以跟踪用户所在的页面,以便他们在进入管理区域时可以返回到该页面,进行一些导航等。然后他们可
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
在 Swift 中,我正在尝试构建一个大型项目集合。在移动中在 CoreData 中创建元素时,速度非常快。然而,当试图为这些项目保留索引时,创建数组 Swift 会对性能产生很大影响。下面的代码是
我有一个定期任务,我正在使用 worker 在 heroku procfile 上实现: Procile web: gunicorn voltbe2.wsgi --log-file - --log-l
我正在用 C# 编写一个应用程序,该应用程序使用 Office Outlook Interop(2010;版本 14)通过 MAPI 访问电子邮件数据。 到目前为止,我必须在 Outlook 的“程序
显然,sun.net.www.protocol.http.HttpURLConnection 将始终将“Java/version”附加到 UserAgent。因此,JSoup Connection.u
我是一名优秀的程序员,十分优秀!