标签: pthreads

非阻塞pthread_join

我正在对多线程服务器的关闭进行编码.如果一切顺利,所有线程都应该自行退出,但是线程卡住的可能性很小.在这种情况下,使用非阻塞连接会很方便所以我能做到.

有没有办法做一个非阻塞的pthread_join?某种定时加入也会很好.

这样的事情:

foreach thread do
  nb_pthread_join();
    if still running
      pthread_cancel();

我可以考虑更多的情况,其中一个非bloking连接将是有用的.

因为似乎没有这样的功能所以我已经编写了一个解决方法,但它并不像我想的那么简单.

c multithreading pthreads

21
推荐指数
3
解决办法
3万
查看次数

pthread_t到gdb线程id

有没有人知道从pthread_t到GDB用信息线程显示的方法?

所以我有:

(gdb) info threads
  37 Thread 22887  0xb7704422 in __kernel_vsyscall ()
  36 Thread 22926  0xb7704422 in __kernel_vsyscall ()
  35 Thread 22925  0xb7704422 in __kernel_vsyscall ()
  34 Thread 22924  0xb7704422 in __kernel_vsyscall ()
  33 Thread 22922  0xb7704422 in __kernel_vsyscall ()
  32 Thread 22921  0xb7704422 in __kernel_vsyscall ()

(gdb) p m_messageQueue->m_creationThread
$3 = 2694822768
(gdb) p/x m_messageQueue->m_creationThread
$4 = 0xa09fbb70
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎么弄清楚这是哪个线程?它似乎是22768,但我的线程都没有那么低.

c gdb pthreads

21
推荐指数
2
解决办法
1万
查看次数

pthread睡眠linux

我正在使用pthreads创建一个包含多个线程的程序.

sleep()导致进程(所有线程)停止执行还是只是我调用的线程sleep

c++ multithreading pthreads

21
推荐指数
3
解决办法
7万
查看次数

在线程程序中,fork(应该是)对信号处理程序是否安全?

我真的不确定POSIX对fork存在线程和信号的安全性的要求.fork被列为异步信号安全功能之一,但如果库代码有可能注册了pthread_atfork非异步信号安全的处理程序,这是否会否定安全性fork?答案取决于运行信号处理程序的线程是否可以使用atfork处理程序所需的资源?或者换句话说,如果atfork处理程序使用同步资源(互斥体等)但是fork从一个从不访问这些资源的线程中执行的信号处理程序调用,程序是否符合要求?

在这个问题的基础上,如果"线程安全"分叉在系统库内部使用建议的惯用语实现pthread_atfork(获取prefork处理程序中的所有锁并释放父和子postfork处理程序中的所有锁),那么就是fork安全的在线程程序中使用信号处理程序?处理信号的线程是否可能处于调用mallocfopen/ fclose和持有全局锁的过程中,从而导致死锁fork

最后,即使fork在信号处理程序中是安全的,在信号处理程序中是否安全fork然后从信号处理程序返回,或者fork在信号处理程序中进行调用总是需要后续调用函数_exit或其中一个exec函数.信号处理程序返回

c deadlock fork signals pthreads

21
推荐指数
2
解决办法
3026
查看次数

如何一次将gdb调试限制为一个线程

我想通过控制哪些线程执行时调试多线程程序.我正在使用C++和gdb.除主线程之外我有两个线程(对于示例程序),我想调试一个线程,同时保持另一个线程停止.

这是我写的示例程序:

#include <iostream>
#include <pthread.h>
#include <stdlib.h>

#define NUM_THREADS 2

using namespace std;

void * run (void *) {
  for (int i = 0; i < 3; ++i) {
    sleep(1);
    cout << i << " " << pthread_self() << endl;
  }
  pthread_exit(NULL);
}

int main (int argc, char** argv) {
  cout << "Start..." << endl;
  int rc;

  pthread_t threads[NUM_THREADS];
  for (int i = 0; i < NUM_THREADS; ++i) {
    rc = pthread_create(&threads[i], NULL, run, NULL);
    if (rc) {
      cout …
Run Code Online (Sandbox Code Playgroud)

gdb pthreads

21
推荐指数
2
解决办法
2万
查看次数

混合pthread.h和C++ 11标准库线程功能是否安全?

我可以生成一个线程pthread_createstd::mutex安全地使用它吗?

我认为如果std::mutex实现为a pthread_mutex_t那么它会很好,但我没有看到任何记录

例如:

#include <pthread.h>
#include <mutex>

namespace {
std::mutex global_lock;
}

void* thread_func(void* vp) {
    // std::mutex used in thread spawned with pthread_create
    std::lock_guard<std::mutex> guard(global_lock);
    // critical section
    return nullptr;
}

int main() {
    pthread_t tid;
    pthread_create(&tid, nullptr, thread_func, nullptr);
    pthread_join(tid, NULL);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我正在运行Debian Wheezy.

c++ mutex pthreads c++11

21
推荐指数
2
解决办法
5830
查看次数

“执行测试 CMAKE_HAVE_LIBC_PTHREAD”失败实际上是什么意思?

cmake 部分输出如下所示:

-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
Run Code Online (Sandbox Code Playgroud)

pthreads cmake

21
推荐指数
1
解决办法
1万
查看次数

如何使用pthread_atfork()和pthread_once()重新初始化子进程中的互斥锁

我们有一个C++共享库,它使用ZeroC的Ice库来实现RPC,除非我们关闭Ice的运行时,否则我们观察到子进程挂在随机互斥锁上.Ice运行时启动线程,具有许多内部互斥锁并保持打开文件描述符到服务器.

另外,我们有一些我们自己的互斥体来保护我们的内部状态.

我们的共享库被数百个内部应用程序使用,因此我们无法控制进程何时调用fork(),因此我们需要一种方法来安全地关闭Ice并在进程分叉时锁定我们的互斥锁.

pthread_atfork()上阅读关于处理互斥锁和内部状态的POSIX标准:

或者,某些库可能只能提供一个子例程,它将库中的互斥锁和所有关联状态重新初始化为某个已知值(例如,最初执行映像时的状态).但是,这种方法是不可能的,因为如果互斥锁或锁仍然被锁定,则允许实现失败*_init()和*_destroy()调用互斥锁和锁.在这种情况下,子例程无法重新初始化互斥锁和锁.

在Linux上,此测试C程序从子pthread_atfork()处理程序中的pthread_mutex_unlock()返回EPERM.Linux需要将_NP添加到PTHREAD_MUTEX_ERRORCHECK宏以便进行编译.

这个程序是从这个好的线程链接的.

鉴于在解锁或破坏子进程中的互斥锁在技术上是不安全或合法的,我认为最好有指向互斥锁的指针,然后让子进程在堆上创建新的pthread_mutex_t并让父进程的互斥锁独立,从而拥有小内存泄漏.

唯一的问题是如何重新初始化库的状态,我正在考虑重新设置pthread_once_t.也许是因为POSIX有一个pthread_once_t的初始化程序,它可以重置为初始状态.

#include <pthread.h>
#include <stdlib.h>
#include <string.h>

static pthread_once_t once_control = PTHREAD_ONCE_INIT;

static pthread_mutex_t *mutex_ptr = 0;

static void
setup_new_mutex()
{
    mutex_ptr = malloc(sizeof(*mutex_ptr));
    pthread_mutex_init(mutex_ptr, 0);
}

static void
prepare()
{
    pthread_mutex_lock(mutex_ptr);
}

static void
parent()
{
    pthread_mutex_unlock(mutex_ptr);
}

static void
child()
{
    // Reset the once control.
    pthread_once_t once = PTHREAD_ONCE_INIT;
    memcpy(&once_control, &once, sizeof(once_control));
}

static void
init()
{
    setup_new_mutex();
    pthread_atfork(&prepare, &parent, &child); …
Run Code Online (Sandbox Code Playgroud)

c multithreading pthreads ice

20
推荐指数
2
解决办法
1万
查看次数

Android NDK中的pthread_cancel()备选方案?

我正在将一个中等大小的C++代码移植到Android NDK.不幸的是,pthreads实现(无论如何,NDK v5)都是不完整的.具体来说,我们的应用程序依赖于pthread_cancel()来终止工作线程.NDK没有实现pthread_cancel()!当工作线程正常响应时,还有其他明显的答案.但是在工作线程没有响应的情况下(例如无限循环),如何在不杀死整个过程的情况下取消它?

c++ pthreads android-ndk

20
推荐指数
1
解决办法
2万
查看次数

pthread_detach问题

直到最近,我的印象是,如果你在产生线程后"分离"一个线程,那么即使在"主"线程终止之后线程仍然存在.

但是一个小实验(如下所列)与我的观点相反.我希望分离的线程继续打印"从分离的线程说话",即使在主要终止之后,但这似乎并没有发生.该应用程序显然终止了......

"主要"问题返回0后,"分离"线程是否死亡?

#include <pthread.h>
#include <stdio.h>

void *func(void *data)
{
    while (1)
    {
        printf("Speaking from the detached thread...\n");
        sleep(5);
    }
    pthread_exit(NULL);
}

int main()
{
    pthread_t handle;
    if (!pthread_create(&handle, NULL, func, NULL))
    {
        printf("Thread create successfully !!!\n");
        if ( ! pthread_detach(handle) )
            printf("Thread detached successfully !!!\n");
    }

    sleep(5);
    printf("Main thread dying...\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c linux multithreading pthreads

20
推荐指数
3
解决办法
4万
查看次数

标签 统计

pthreads ×10

c ×5

multithreading ×4

c++ ×3

gdb ×2

android-ndk ×1

c++11 ×1

cmake ×1

deadlock ×1

fork ×1

ice ×1

linux ×1

mutex ×1

signals ×1