草庐IT

pthread_mutex_lock

全部标签

c++ - pthread_rwlock 可以同时拥有多少个读者?

我有一个多线程应用程序,它创建了48个线程,它们都需要访问一个公共(public)属性(STL::map)。map只会在线程启动时写入,其余时间将从中读取map。这似乎是pthread_rw_lock的完美用例,而且一切似乎都运行良好。我遇到了一个完全不相关的段错误并开始分析内核。使用gdb,我执行了命令infothreads并且对结果感到非常惊讶。我观察到有几个线程实际上正在按预期从映射中读取,但奇怪的是,有几个线程在等待rw_lock的pthread_rwlock_rdlock()中被阻塞。这是等待锁的线程的堆栈跟踪:#00xffffe430in__kernel_vsyscall(

c++ - pthread_rwlock 可以同时拥有多少个读者?

我有一个多线程应用程序,它创建了48个线程,它们都需要访问一个公共(public)属性(STL::map)。map只会在线程启动时写入,其余时间将从中读取map。这似乎是pthread_rw_lock的完美用例,而且一切似乎都运行良好。我遇到了一个完全不相关的段错误并开始分析内核。使用gdb,我执行了命令infothreads并且对结果感到非常惊讶。我观察到有几个线程实际上正在按预期从映射中读取,但奇怪的是,有几个线程在等待rw_lock的pthread_rwlock_rdlock()中被阻塞。这是等待锁的线程的堆栈跟踪:#00xffffe430in__kernel_vsyscall(

linux - 锁定 C++11 std::unique_lock 导致死锁异常

我正在尝试使用C++11std::condition_variable,但是当我尝试从第二个线程锁定与其关联的unique_lock时,出现异常“已避免资源死锁”。创建它的线程可以锁定和解锁它,但第二个线程不能,尽管我很确定unique_lock不应该在第二个线程尝试锁定它时已经锁定。FWIW我在Linux中使用gcc4.8.1和-std=gnu++11。我已经围绕condition_variable、unique_lock和mutex编写了一个包装器类,因此我的代码中没有任何其他内容可以直接访问它们。注意std::defer_lock的使用,我已经掉进了那个陷阱:-)。classCo

linux - 锁定 C++11 std::unique_lock 导致死锁异常

我正在尝试使用C++11std::condition_variable,但是当我尝试从第二个线程锁定与其关联的unique_lock时,出现异常“已避免资源死锁”。创建它的线程可以锁定和解锁它,但第二个线程不能,尽管我很确定unique_lock不应该在第二个线程尝试锁定它时已经锁定。FWIW我在Linux中使用gcc4.8.1和-std=gnu++11。我已经围绕condition_variable、unique_lock和mutex编写了一个包装器类,因此我的代码中没有任何其他内容可以直接访问它们。注意std::defer_lock的使用,我已经掉进了那个陷阱:-)。classCo

java - Java JVM 是否使用 pthread?

MacOSX上的JVM是否使用pthread创建线程?在Linux发行版上,现在是否默认为所有发行版上的JVM创建线程? 最佳答案 是的,HotSpotJVM(即OracleJDK和OpenJDK)在Linux上使用pthreads和MacOSX. 关于java-JavaJVM是否使用pthread?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/30816307/

java - Java JVM 是否使用 pthread?

MacOSX上的JVM是否使用pthread创建线程?在Linux发行版上,现在是否默认为所有发行版上的JVM创建线程? 最佳答案 是的,HotSpotJVM(即OracleJDK和OpenJDK)在Linux上使用pthreads和MacOSX. 关于java-JavaJVM是否使用pthread?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/30816307/

linux - 强制 GCC 静态链接,例如pthreads(而不是动态链接)

我的程序构建为一个加载器和许多模块,它们是共享库。现在,其中一个库使用pthreads,它似乎动态绑定(bind)到模块(在启动时加载)。现在,如果我可以强制将pthreads链接到模块文件中,那就更简单了。Linux上的GCC,我该怎么做?我想libpthread.a是必需的.... 最佳答案 虽然将libpthread.a链接到共享库在理论上是可行的,但这是一个非常糟糕的主意。原因是libpthread是glibc的一部分,所有glibc的部分必须完全匹配,否则您会看到奇怪且无法解释的崩溃。因此将libpthread.a链接到您

linux - 强制 GCC 静态链接,例如pthreads(而不是动态链接)

我的程序构建为一个加载器和许多模块,它们是共享库。现在,其中一个库使用pthreads,它似乎动态绑定(bind)到模块(在启动时加载)。现在,如果我可以强制将pthreads链接到模块文件中,那就更简单了。Linux上的GCC,我该怎么做?我想libpthread.a是必需的.... 最佳答案 虽然将libpthread.a链接到共享库在理论上是可行的,但这是一个非常糟糕的主意。原因是libpthread是glibc的一部分,所有glibc的部分必须完全匹配,否则您会看到奇怪且无法解释的崩溃。因此将libpthread.a链接到您

c - Intel 指令的 LOCK 前缀。重点是什么?

我看了Intel手册,发现指令有一个锁前缀,可以防止处理器同时写入同一个内存位置。我对此很兴奋。我想它可以用作硬件互斥体。所以我写了一段代码来试一试。结果非常令人沮丧。该锁不支持MOV或LEA指令。手册上说LOCK只支持ADD、ADC、AND、BTC、BTR、BTS、CMPXCHG、CMPXCH8B、DEC、INC、NEG、NOT、OR、SBB、SUB、XOR、XADD和XCHG。此外,如果LOCK前缀与这些指令之一一起使用并且源操作数是内存操作数,则可能会生成未定义的操作码异常(#UD)。我想知道为什么那么多的限制,那么多的限制让LOCK显得毫无用处。我不能用它来保证一般的写操作不会

c - Intel 指令的 LOCK 前缀。重点是什么?

我看了Intel手册,发现指令有一个锁前缀,可以防止处理器同时写入同一个内存位置。我对此很兴奋。我想它可以用作硬件互斥体。所以我写了一段代码来试一试。结果非常令人沮丧。该锁不支持MOV或LEA指令。手册上说LOCK只支持ADD、ADC、AND、BTC、BTR、BTS、CMPXCHG、CMPXCH8B、DEC、INC、NEG、NOT、OR、SBB、SUB、XOR、XADD和XCHG。此外,如果LOCK前缀与这些指令之一一起使用并且源操作数是内存操作数,则可能会生成未定义的操作码异常(#UD)。我想知道为什么那么多的限制,那么多的限制让LOCK显得毫无用处。我不能用它来保证一般的写操作不会