GVKun编程网logo

c – boost :: interprocess :: scoped_lock应用程序在锁内部崩溃(c++ try lock)

6

对于想了解c–boost::interprocess::scoped_lock应用程序在锁内部崩溃的读者,本文将是一篇不可错过的文章,我们将详细介绍c++trylock,并且为您提供关于android

对于想了解c – boost :: interprocess :: scoped_lock应用程序在锁内部崩溃的读者,本文将是一篇不可错过的文章,我们将详细介绍c++ try lock,并且为您提供关于android – 应用程序在锁定/睡眠屏幕崩溃 – NullPointerException、boost :: mutex :: timed_lock不在Linux上、c – Boost.MPI和Boost.Interprocess之间有什么区别?、c – 为什么boost :: interprocess :: managed_shared_ptr为非const不能转换为managed_shared_ptr为const的有价值信息。

本文目录一览:

c – boost :: interprocess :: scoped_lock应用程序在锁内部崩溃(c++ try lock)

c – boost :: interprocess :: scoped_lock应用程序在锁内部崩溃(c++ try lock)

我正在使用boost :: interprocess :: scoped_lock,如果应用程序由于某种原因在范围内发生故障,则不会释放互斥锁.
下次执行应用程序时(不重新启动计算机),互斥锁被锁定.

这打算如何工作?
我举一个下面代码的简单例子.

{
    boost::interprocess::named_mutex lockMutex(boost::interprocess::open_or_create,"lockName");
    boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(lockMutex);
    //crash here
}

我最终做了一个像下面这样的超时.谁能想出一个不限制锁定时间的解决方案?

boost::interprocess::named_mutex named_mtx(boost::interprocess::open_or_create,lockName.c_str());

    while(true)
    {
        if(named_mtx.try_lock())
        {
            break;
        }

        if(!named_mtx.timed_lock(boost::get_system_time() + boost::posix_time::milliseconds(TIMEOUT_MILLISECONDS)))
        {
            named_mtx.unlock();
        }
    }

解决方法

这对我来说似乎完全合乎逻辑:)

当您的应用程序崩溃时,映射到您的OS进程间通信机制(IPC)的互斥锁不会被释放.当您的应用程序重新启动时,它会尝试获取互斥锁而不会成功!

我想你的应用程序有不同的需要同步的子系统(进程).

如果您的某个子系统崩溃,您必须设计一个全局策略来正确管理锁.例如,如果您的某个子系统崩溃,它应该在启动时尝试解锁互斥锁.它可能很棘手,因为其他子系统使用该锁.超时也可以提供帮助.在任何情况下,您必须设计策略,记住任何进程在锁定互斥锁时都可能崩溃…

当然,如果您不需要进程间锁定,请使用简单的作用域锁定:)

MY2C

android – 应用程序在锁定/睡眠屏幕崩溃 – NullPointerException

android – 应用程序在锁定/睡眠屏幕崩溃 – NullPointerException

使用设备进行测试 – 每当我锁定屏幕(或闲置1分钟后休眠),应用程序崩溃,logcat会在onResume()方法的imageView.setonClickListener上显示NullPointerException.

这是我获得异常的代码的一小部分:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.critical_items_list);

    // instantiate member variables

    mExtras = getIntent().getExtras();
    mItems_P1 = mExtras.getParcelableArrayList(EXTRA_ITEMS_P1);
    mItems_P2 = mExtras.getParcelableArrayList(EXTRA_ITEMS_P2);
    mItems_Engine = mExtras.getParcelableArrayList(EXTRA_ITEMS_ENGINE); 
}

protected void onResume() {
    super.onResume();

    ImageView imageAddToMultiple = (ImageView) findViewById(R.id.image_add_to_multiple);

    //This is where the I get the NullPointer
    imageAddToMultiple.setonClickListener(listenerAddToMultipleItems); 

    refreshLists();
    ListView listP1 = (ListView) findViewById(R.id.list_p1);
    ListView listP2 = (ListView) findViewById(R.id.list_p2);
    ListView listEngine = (ListView) findViewById(R.id.list_engine);

    listP1.setAdapter(new MyAdapter(mList_P1));
    listP2.setAdapter(new MyAdapter(mList_P2));
    listEngine.setAdapter(new MyAdapter(mList_Engine));
}

imageView本身位于RelativeLayout:

ravity="center" >

        ravity="center"
            android:text="@string/plant_1"
            android:textColor="@android:color/black" />
    ravity="center" >

        ravity="center"
            android:gravity="center"
            android:text="@string/plant_2"
            android:textColor="@android:color/black" />
    ravity="center"
            android:text="@string/engine"
            android:textColor="@android:color/black" />
    

我不知道为什么我会得到这个NullPointer.

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to resume activity {nmw.nss/nmw.nss.CriticalList}: java.lang.NullPointerException at
android.app.ActivityThread.performResumeActivity(ActivityThread.java:2820)
at
android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2859)
at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2242)
at android.app.ActivityThread.access$600(ActivityThread.java:139) at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
at android.os.Handler.dispatchMessage(Handler.java:99) at
android.os.Looper.loop(Looper.java:154) at
android.app.ActivityThread.main(ActivityThread.java:4974) at
java.lang.reflect.Method.invokeNative(Native Method) at
java.lang.reflect.Method.invoke(Method.java:511) at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at
dalvik.system.NativeStart.main(Native Method) Caused by:
java.lang.NullPointerException at
nmw.nss.CriticalList.onResume(CriticalList.java:93)

at
android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1236)
at android.app.Activity.performResume(Activity.java:4620) at
android.app.ActivityThread.performResumeActivity(ActivityThread.java:2804)
… 12 more

谢谢.

编辑:我添加了完整的活动(类型),xml和logcat.
我是否需要覆盖任何Activity方法,可能是onStop或onPause以使其工作?

最佳答案
终于找到了!
我的应用程序基本上是在横向模式下运行,而在清单中我添加了——-
机器人:screenorientation = “风景”.

好吧,这就是问题:在你锁定设备的模式下,findViewById()总是在纵向模式下搜索XML并且在我的情况下,根本没有ImageView.因此NullPointerException.

boost :: mutex :: timed_lock不在Linux上

boost :: mutex :: timed_lock不在Linux上

我有一个使用VS2010开发的应用程序,它使用Boost.Thread 1.48。

目前我正试图将应用程序移植到Linux上(在Debian 7上运行)。

当我尝试使用GCC 4.6或clang进行编译时,出现以下错误

error: ''class boost::mutex'' has no member named ''timed_lock''

是否有任何预处理器定义或编译器标志,我必须设置?

获取PostThreadMessage的boost :: thread的ID

在Windows上使用WaitForSingleObject,但支持提升线程中断

为什么Valgrind使用boost :: thread显示堆栈使用量增加?

如何使用助推primefaces来消除竞争条件?

启动Boost线程时保证

编辑:好的,我发现了这个问题。 我使用了以下内容:

myfile.h:

boost::mutex myMutex;

MYFILE.CPP

if(myMutex.timed_lock(boost::posix_time::millisec(10000))) { // Do stuff // ... // ... myMutex.unlock(); return true; } myMutex.unlock(); return false;

这适用于VS2008 / 2010。 在Linux下,我不得不把头改为:

boost::timed_mutex myMutex;

我还不是很确定,原因是什么。

Boost为同一个线程获取多个锁

get_id和GetCurrentThreadId之间的区别

Boost.Thread链接 – boost_thread与boost_thread-mt

在Windows平台的boost :: mutex和boost :: timed_mutex共享相同的实现。 这是一个实现细节。

如果你想使用timed_lock()作为Boost.Thread文件,你应该使用boost :: time_mutex。

http://www.boost.org/doc/libs/1_55_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types.timed_mutex

总结

以上是小编为你收集整理的boost :: mutex :: timed_lock不在Linux上全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

c – Boost.MPI和Boost.Interprocess之间有什么区别?

c – Boost.MPI和Boost.Interprocess之间有什么区别?

我想Boost.MPI和Boost.Interprocess是不同的,对吧?

从性能角度来看,哪个更快?有没有人做过基准测试?

我可以使用它们在同一进程中传递数据(即在不同的线程中)吗?

谢谢!

解决方法

他们是完全不同的. Boost MPI用于并行/分布式计算(如大规模并行超级计算机).它需要现有的MPI(消息传递接口)安装,例如OpenMPI. MPI通常用于联网计算机的高性能集群,或超级计算机. Boost MPI库基本上只是普通MPI函数调用的一个很好的包装器.

另一方面,Boost.Interprocess是IPC(进程间通信)的API,即在单个计算机上的两个进程之间进行通信.

如果要在同一台计算机上的进程之间共享数据,Boost.Interprocess非常有用.但是,如果按照您的建议,您只想在线程之间共享数据,则不需要任何此类数据.您只需要一个线程API.

c – 为什么boost :: interprocess :: managed_shared_ptr为非const不能转换为managed_shared_ptr为const

c – 为什么boost :: interprocess :: managed_shared_ptr为非const不能转换为managed_shared_ptr为const

据我所知,以下内容对boost :: shared_ptr有效:

boost::shared_ptr<SomeData> ptr;
...
boost::shared_ptr<const SomeData> c_ptr = ptr; // Valid

对于boost :: interprocess :: managed_shared_ptr,相同的行为不适用.为什么?

解决方法

boost :: interprocess :: managed_shared_ptr实际上不是共享指针;它只是一个帮助类,您可以使用它来定义一个类型.从 interprocess docs:

typedef managed_shared_ptr<MyType,managed_shared_memory>::type my_shared_ptr;

And the creation of a shared pointer can be simplified to this:

[c++]

my_shared_ptr sh_ptr = make_managed_shared_ptr
(segment.construct<MyType>("object to share")(),segment);

使用上面示例中的“sh_ptr”,以下内容应该有效:

typedef managed_shared_ptr<const MyType,managed_shared_memory>::type my_shared_const_ptr;
my_shared_const_ptr sh_c_ptr = sh_ptr;

因为这两个对象实际上是共享指针.

另一方面,做:

managed_shared_ptr<MyType,managed_shared_memory> ptr;
managed_shared_ptr<const MyType,managed_shared_memory> c_ptr = ptr;

将无法正常工作,因为在这种情况下,ptr和c_ptr是very simple structs除了make 3 typedef之外什么都不做,所以它们不会转换.

今天关于c – boost :: interprocess :: scoped_lock应用程序在锁内部崩溃c++ try lock的讲解已经结束,谢谢您的阅读,如果想了解更多关于android – 应用程序在锁定/睡眠屏幕崩溃 – NullPointerException、boost :: mutex :: timed_lock不在Linux上、c – Boost.MPI和Boost.Interprocess之间有什么区别?、c – 为什么boost :: interprocess :: managed_shared_ptr为非const不能转换为managed_shared_ptr为const的相关知识,请在本站搜索。

本文标签: