标签: pthreads

如何加入阻塞IO的线程?

我有一个在后台运行的线程,它以阻塞的方式从输入设备读取事件,现在当我退出应用程序时我想正确地清理线程,但是我不能只运行pthread_join()因为线程由于阻塞IO,它永远不会退出.

我该如何正确解决这种情况?我应该发送pthread_kill(theard,SIGIO)还是pthread_kill(theard,SIGALRM)来打破阻塞?是其中任何一个甚至是正确的信号?或者有另一种方法来解决这种情况,并让该子线程退出阻塞读取?

目前有点困惑,因为我的谷歌搜索没有找到解决方案.

这是在Linux上并使用pthreads.

编辑:我用SIGIO和SIGALRM玩了一下,当我没有安装信号处理程序时他们打破了阻塞IO,但在控制台上给出了一条消息("I/O可能")但是当我安装一个信号处理程序时,为了避免该消息,它们不再破坏阻塞IO,因此线程不会终止.所以我回到了第一步.

c linux multithreading pthreads

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

在Linux上等待多个条件变量而没有不必要的睡眠?

我正在编写一个对延迟敏感的应用程序,它实际上想要一次等待多个条件变量.我之前已经阅读了几种在Linux上获得此功能的方法(显然这是在Windows上构建的),但它们似乎都不适合我的应用程序.我所知道的方法是:

  1. 让一个线程等待你想要等待的每个条件变量,当被唤醒时会发出一个你等待的单个条件变量.

  2. 通过定时等待循环遍历多个条件变量.

  3. 将虚拟字节写入文件或管道,然后轮询这些字节.

#1和#2不合适,因为它们会造成不必要的睡眠.使用#1,你必须等待虚拟线程唤醒,然后发出真实线程的信号,然后唤醒真正的线程,而不是真正的线程刚刚开始唤醒 - 额外的调度程序量子花费在这实际上对我的应用程序很重要,我宁愿不必使用完整的RTOS.#2更糟糕的是,你可能花费N*超时时间睡眠,或者你的超时将是0,在这种情况下你永远不会睡觉(无休止地烧掉CPU和饿死其他线程也很糟糕).

对于#3,管道是有问题的,因为如果"发出信号"的线程忙或甚至崩溃(我实际上处理的是单独的进程而不是线程 - 互斥和条件将存储在共享内存中),那么写入线程将被卡住,因为管道的缓冲区将是满的,任何其他客户端也是如此.文件存在问题,因为应用程序运行的时间越长,它就会无休止地增长.

有一个更好的方法吗?对于适用于Solaris的答案感到好奇.

c multithreading scheduling pthreads conditional-statements

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

为什么start_routine for pthread_create返回void*并取无效*

pthread_create看起来像这样的函数头:

int pthread_create(pthread_t * thread, 
                   const pthread_attr_t * attr,
                   void * (*start_routine)(void *), 
                   void *arg);
Run Code Online (Sandbox Code Playgroud)

我理解这一切除了函数指针start_routine的形式void* (*fpointer) (void*),这意味着它接受一个void指针并返回一个void指针.

它所采用的void指针只是一种将参数传递给start_routine的方法,我得到了那个部分,但是我不明白为什么函数返回一个void指针?什么代码甚至会注意到void指针?

c posix pthreads

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

使用pthread_cancel取消线程:良好做法或不好

我在Linux(CentOS 5.3)上有一个C++程序,它产生多个线程,这些线程处于无限循环中以执行作业并在某些时间内休眠.现在我必须取消正在运行的线程以防新的配置通知进入并重新启动新的线程集,我已经使用了pthread_cancel.我观察到的是,即使在接收到取消指示后,线程也没有停止,甚至在睡眠完成后一些睡眠线程也会出现.

由于不需要这种行为,在上述场景中使用pthread_cancel会引发关于好坏练习的问题.

请评论上述场景中的pthread_cancel用法.

c++ linux pthreads

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

什么是PTHREAD_MUTEX_ADAPTIVE_NP

我在哪里可以找到"自适应"pthread互斥锁的文档?符号PTHREAD_MUTEX_ADAPTIVE_NP是在我的系统上定义的,但我在网上找到的唯一文档没有说明自适应互斥锁是什么,或者什么时候适合使用.

那么......它是什么,何时才能使用它?

作为参考,我的libc版本是:

GNU C Library (Ubuntu EGLIBC 2.15-0ubuntu10.5) stable release version 2.15, by Roland McGrath et al.
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.6.3.
Compiled on a Linux 3.2.50 system on 2013-09-30.
Available extensions:
    crypt add-on version 2.1 by Michael Glad and others
    GNU Libidn by Simon …
Run Code Online (Sandbox Code Playgroud)

c multithreading pthreads

26
推荐指数
3
解决办法
8012
查看次数

使用Boost在Linux中设置线程优先级

Boost Libraries似乎没有设置线程优先级的设备.这是在Linux上使用的最佳代码还是有更好的方法?

boost::thread myThread( MyFunction() );

struct sched_param param;
param.sched_priority = 90;
pthread_attr_setschedparam( myThread.native_handle(), SCHED_RR, &param);
Run Code Online (Sandbox Code Playgroud)

我没有很多Linux编程经验.

c++ linux boost posix pthreads

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

唤醒线程在accept()调用时被阻塞

Linux上的套接字问题

我有一个在accept()调用时阻塞的工作线程.它只是等待传入的网络连接,处理它,然后返回监听下一个连接.

当程序退出的时候,我如何发信号通知此网络工作线程(从主线程)从accept()调用返回,同时仍能正常退出其循环并处理其清理代码.

我试过的一些事情:

  1. pthread_kill发送信号.感觉很难做到这一点,加上它不能可靠地允许线程执行它的关闭逻辑.也使程序终止.如果可能的话,我想避免发出信号.

  2. pthread_cancel可以.与上述相同.这是对线程的严厉杀戮.那个,线程可能正在做其他事情.

  3. 从主线程关闭listen套接字以使accept()中止.这不可靠.

一些限制:

如果解决方案涉及使监听套接字无阻塞,那很好.但我不想接受一个解决方案,该解决方案涉及线程每隔几秒钟通过一次选择呼叫唤醒以检查退出条件.

退出的线程条件可能与退出的进程无关.

从本质上讲,我想要的逻辑看起来像这样.

void* WorkerThread(void* args)
{
    DoSomeImportantInitialization();  // initialize listen socket and some thread specific stuff

    while (HasExitConditionBeenSet()==false)
    {
        listensize = sizeof(listenaddr);
        int sock = accept(listensocket, &listenaddr, &listensize);

        // check if exit condition has been set using thread safe semantics
        if (HasExitConditionBeenSet())
        {
            break;
        }

        if (sock < 0)
        {
            printf("accept returned %d (errno==%d)\n", sock, errno);
        }
        else
        {
            HandleNewNetworkCondition(sock, &listenaddr);
        }
    }

    DoSomeImportantCleanup(); // close listen socket, close connections, cleanup …
Run Code Online (Sandbox Code Playgroud)

c sockets pthreads

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

何时使用pthread_cancel而不是pthread_kill?

什么时候使用pthread_cancel而不是pthread_kill

pthreads

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

pthread互斥体的"属性"是什么?

函数pthread_mutex_init允许您指定指向属性的指针.但我还没有找到pthread属性的详细解释.我总是提供NULL.这个论点有用吗?

文档,对于那些忘记它的人:

PTHREAD_MUTEX_INIT(3)BSD库函数手册
PTHREAD_MUTEX_INIT(3)

名称pthread_mutex_init - 创建互斥锁

概要

 #include <pthread.h>

 int
 pthread_mutex_init(pthread_mutex_t *restrict mutex,
     const pthread_mutexattr_t *restrict attr);
Run Code Online (Sandbox Code Playgroud)

说明pthread_mutex_init()函数创建一个新的互斥锁,其属性由attr指定.如果attr为NULL,则使用默认属性.

attributes mutex pthreads

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

使用条件变量优于互斥锁的优点

我想知道在pthreads中使用条件变量而不是互斥锁的性能优势是什么.

我发现:"没有条件变量,程序员需要让线程连续轮询(可能在一个关键部分),检查是否满足条件.这可能非常耗费资源,因为线程会持续忙于此条件变量是一种在没有轮询的情况下实现相同目标的方法." (https://computing.llnl.gov/tutorials/pthreads)

但似乎互斥锁调用也是阻塞的(与自旋锁不同).因此,如果线程(T1)无法获得锁定,因为某些其他线程(T2)具有锁定,则操作系统将T1置于休眠状态,并且仅在T2释放锁定并且OS为T1提供锁定时才唤醒.线程T1没有真正轮询以获得锁定.从该描述中,似乎使用条件变量没有性能优势.在任何一种情况下,都不涉及民意调查.操作系统无论如何都提供了条件变量范例可以提供的好处.

你能解释一下究竟发生了什么吗?

variables multithreading mutex pthreads conditional-statements

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