对于想了解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)
- 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)
下次执行应用程序时(不重新启动计算机),互斥锁被锁定.
这打算如何工作?
我举一个下面代码的简单例子.
{ 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
使用设备进行测试 – 每当我锁定屏幕(或闲置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上
我有一个使用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之间有什么区别?
从性能角度来看,哪个更快?有没有人做过基准测试?
我可以使用它们在同一进程中传递数据(即在不同的线程中)吗?
谢谢!
解决方法
另一方面,Boost.Interprocess是IPC(进程间通信)的API,即在单个计算机上的两个进程之间进行通信.
如果要在同一台计算机上的进程之间共享数据,Boost.Interprocess非常有用.但是,如果按照您的建议,您只想在线程之间共享数据,则不需要任何此类数据.您只需要一个线程API.
c – 为什么boost :: interprocess :: managed_shared_ptr为非const不能转换为managed_shared_ptr为const
boost::shared_ptr<SomeData> ptr; ... boost::shared_ptr<const SomeData> c_ptr = ptr; // Valid
对于boost :: interprocess :: managed_shared_ptr,相同的行为不适用.为什么?
解决方法
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的相关知识,请在本站搜索。
本文标签: