我在基于linux的(arm)通信应用程序中在不可预测的时间遇到以下错误:
pthread_mutex_lock.c:82: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
Run Code Online (Sandbox Code Playgroud)
谷歌出现了很多关于这个错误的引用,但很少有与我的情况相关的信息.我想知道是否有人可以给我一些关于如何解决此错误的想法.有谁知道这个断言的常见原因?
提前致谢.
我只是希望我的主线程在退出之前等待任何和所有我的(p)线程完成.
由于不同的原因,线程出现了很多,我真的不想跟踪所有这些 - 我只是想知道它们什么时候都消失了.
wait()为子进程执行此操作,在没有子进程时返回ECHILD,但是等待(似乎没有)(p)线程.
我真的不想经历保存每个未完成线程列表的麻烦(因为它们来来去去),然后必须在每个线程上调用pthread_join.
有一个快速而肮脏的方法来做到这一点?
我有以下功能:
void *foo(void *i) {
int a = (int) i;
}
int main() {
pthread_t thread;
int i;
pthread_create(&thread, 0, foo, (void *) i);
}
Run Code Online (Sandbox Code Playgroud)
在编译时,有一些关于强制转换((void *) i和int a = (int) i)的错误.如何pthread_create正确传递整数作为最后一个参数?
考虑一个简单的(在我的情况下是全局)变量:
int i;
Run Code Online (Sandbox Code Playgroud)
在某处访问此变量
pthread_mutex_lock(i_mutex);
if(i == other value) {
do_something();
}
pthread_mutex_unlock(i_mutex);
Run Code Online (Sandbox Code Playgroud)
另一个线程i 在保持时更新i_mutex.编译器可以缓存值,i所以我没有得到最近的值?一定i是不稳定的?
pthread和fork wrt linux在实现差异以及调度如何变化(它是否变化?)方面的基本区别是什么?
我在两个类似的程序上运行strace,一个使用pthreads而另一个使用fork,最后make clone()syscall都有不同的参数,所以我猜这两个在linux系统上基本相同,但是pthreads更容易处理在代码中.
有人可以给出深刻的解释吗?
编辑:另见相关问题
我一直在努力熟悉C++ 11中的std :: thread库,并且遇到了绊脚石.
最初我来自posix线程背景,并想知道如何在构造之前设置std :: thread的堆栈大小,因为我似乎无法找到执行此类任务的任何引用.
使用pthreads设置堆栈大小是这样的:
void* foo(void* arg);
.
.
.
.
pthread_attr_t attribute;
pthread_t thread;
pthread_attr_init(&attribute);
pthread_attr_setstacksize(&attribute,1024);
pthread_create(&thread,&attribute,foo,0);
pthread_join(thread,0);
Run Code Online (Sandbox Code Playgroud)
使用std :: thread时有类似的东西吗?
我一直在使用以下参考:
Go的多线程方法和其他方法有什么区别,比如pthread,boost :: thread或Java Threads?
我有一个非常大的应用程序,它动态加载共享对象并在共享对象中执行代码.作为一种预防措施,我在几乎所有内容中都试了一下main.我为3件事创造了一个捕获:( myException内部异常)std::exception,和...(捕获所有异常).
作为共享对象执行的一部分,pthreads创建了许多对象.当一个线程抛出异常时,它不会被捕获main.这是标准行为吗?我怎样才能捕获所有异常,无论它们被抛出什么线程?
如果我直接使用g ++在命令行上编译,我可以看到我需要的一切:
$ g++ -pthread test.cpp
$ ldd a.out
linux-vdso.so.1 => (0x00007fffd05b3000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4a1ba8d000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4a1b870000)
...more...
Run Code Online (Sandbox Code Playgroud)
然后我尝试为这个5行测试应用程序创建一个简单的cmake文件:
$ cat CMakeLists.txt
PROJECT ( Test CXX )
CMAKE_MINIMUM_REQUIRED ( VERSION 2.8 )
FIND_PACKAGE ( Threads REQUIRED )
ADD_EXECUTABLE ( test test.cpp )
TARGET_LINK_LIBRARIES ( test ${CMAKE_THREAD_LIBS_INIT} )
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚为什么CMake找不到它需要用的东西Threads:
$ cd build/
$ cmake ..
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (MESSAGE):
Could NOT find Threads (missing: Threads_FOUND)
Call Stack (most recent call first):
/usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:288 (_FPHSA_FAILURE_MESSAGE)
/usr/share/cmake-2.8/Modules/FindThreads.cmake:166 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) …Run Code Online (Sandbox Code Playgroud) 我是多线程/流程编程的新手.所以这就是我需要澄清的内容.
处理代码
pthread_mutex_lock()
pthread_create(fooAPI(sharedResource)) //fooAPI creates another thread with shared resource that shares across processes.
pthread_mutex_unlock()
Run Code Online (Sandbox Code Playgroud)
使用上面的伪代码,sharedResource如果未解锁互斥锁,进程B是否能够访问?
如何正确访问进程B中的sharedResource?
有没有明确的可视图解释互斥体,线程和进程之间的关系?