免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4156 | 回复: 9
打印 上一主题 下一主题

linux编程中有没有APC(异步过程调用),能不能让某个线程进入Alertable状态???? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-29 14:40 |只看该作者 |倒序浏览
信号处理是不是不能达到这个效果,信号处理是不是对进程(主线程)而言的?

不论现在是哪个线程在执行,信号来了都会由主线程来执行信号处理程序?


有没有像windows的方法让某个线程进入Alertable状态,

有apc数据的时候由这个线程来执行信号处理程序呢?


我的意思是让某个线程在没有数据要处理的时候就在那里呆着,

在有数据到达的时候就可以立即得到处理。


并且不想通过事件(condition)和semaphore机制,因为他们有可能会丢失,

semaphore还会有上限。


QUOTE:
原帖由 Edengundam 于 2007-5-30 07:30 发表
你查查Condition Variables.
是线程同步的一种手段......用mutex保护一个condition. 在condition满足后, 能够调用pthread_cond_signal & pthread_cond_broadcast唤醒挂起的进程.
我要条件变量是来控制线程退出的,我希望我的线程一直等着Condition Variable(有信号就退出)。
while(1)
{
    // 我希望在这里可以让线程进入一种alertable状态,有消息到达这个线程的时候就可以去处理,就像windows 系统中提供的apc一样。而不是要用下面的函数。
     if( pthread_cond_timedwait(cond/*线程退出条件*/,  mutex, abstime) == 0)
        break;
}


windows中像这么写:

   while(1)
    {
        DWORD dwRet = WaitForSingleObjectEx(Event, INFINITE, TRUE);
        if(dwRet == WAIT_OBJECT_0)
            break;
        else if(dwRet == WAIT_IO_COMPLETION)
            printf("WAIT_IO_COMPLETION\n");
     }

[ 本帖最后由 xiaoligang 于 2007-5-30 09:59 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2007-05-29 14:44 |只看该作者
fork,execl

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2007-05-29 14:45 |只看该作者
pthread:
pthread_create之后pthread_detach

论坛徽章:
0
4 [报告]
发表于 2007-05-29 15:10 |只看该作者

回复 3楼 cjaizss 的帖子

我的意思是让某个线程在没有数据要处理的时候就在那里呆着,在有数据到达的时候就可以立即得到处理。
并且不想通过事件和semaphore机制,因为他们有可能会丢失,semaphore还会有上限。

论坛徽章:
0
5 [报告]
发表于 2007-05-30 06:23 |只看该作者
为什么这么多人浏览确没有人给我解释一下呢?

论坛徽章:
0
6 [报告]
发表于 2007-05-30 07:30 |只看该作者
你查查Condition Variables.
是线程同步的一种手段......用mutex保护一个condition. 在condition满足后, 能够调用pthread_cond_signal & pthread_cond_broadcast唤醒挂起的进程.

论坛徽章:
0
7 [报告]
发表于 2007-05-30 07:53 |只看该作者
建个线程池哈

论坛徽章:
0
8 [报告]
发表于 2007-05-30 09:49 |只看该作者
原帖由 Edengundam 于 2007-5-30 07:30 发表
你查查Condition Variables.
是线程同步的一种手段......用mutex保护一个condition. 在condition满足后, 能够调用pthread_cond_signal & pthread_cond_broadcast唤醒挂起的进程.


我要条件变量是来控制线程退出的,我希望我的线程一直等着Condition Variable(有信号就退出)。
while(1)
{
    // 我希望在这里可以让线程进入一种alertable状态,有消息到达这个线程的时候就可以去处理,就像windows系统中提供的apc一样。而不是要用下面的函数。
     if( pthread_cond_timedwait(cond/*线程退出条件*/,  mutex, abstime) == 0)
        break;
}

windows中像这么写:

   while(1)
    {
        DWORD dwRet = WaitForSingleObjectEx(Event, INFINITE, TRUE);
        if(dwRet == WAIT_OBJECT_0)
            break;
        else if(dwRet == WAIT_IO_COMPLETION)
            printf("WAIT_IO_COMPLETION\n");
     }

[ 本帖最后由 xiaoligang 于 2007-5-30 10:00 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-05-30 15:16 |只看该作者
你的意思是不是一个线程执行逻辑,执行完之后就停着不动了啊。
然后有任务的时候可以继续执行,然后再停止不动了啊。
看看这个能不能帮上你

#ifndef __G_THREAD__
#define __G_THREAD__
#include "def.h"

class G_Thread
{
    public:
        /// @brief 构造函数
        G_Thread();

        /// @brief 析构函数
        ~G_Thread();

        /// @brief 获得线程id
        ///
        /// @return 线程id
        pthread_t getThreadId();

        /// @brief 启动线程
        bool Start();

        /// @brief 线程停止
        void pause();

        /// @brief 线程继续运行
        void continues();
         
         
    private:
        /// @brief  屏蔽SIGUSR1信号 , POSIX标准建议在调用sigwait()等待信号以前,进程中所有线程都应>屏蔽该信号,以保证仅有sigwait()的调用者获得该信号 , 如果不屏蔽该信号,在sigwait()之前调用pthread_kill()就会出现User defined signal 1.
        void maskSIGUSR1();

        /// @brief 线程pid
        pthread_t g_pid;

        /// @brief 信号
        sigset_t g_waitSig;

        /// @brief 线程运行主函数
        ///
        /// @param arg
        ///
        /// @return
        static void *threadFun(void *arg);

    protected:
        virtual void Run() = 0;

};

#endif


.cpp
#include "Thread.h"
#include "Log.h"

G_Thread::G_Thread()
{
    maskSIGUSR1();

    // 定义SIGUSR1信号阻塞
    sigemptyset(&g_waitSig);
    sigaddset(&g_waitSig, SIGUSR1);

}

G_Thread::~G_Thread()
{
}

void G_Thread::maskSIGUSR1()
{
    sigset_t sig;
    sigemptyset(&sig);
    sigaddset(&sig , SIGUSR1);
    pthread_sigmask(SIG_BLOCK , &sig , NULL);
}

pthread_t G_Thread::getThreadId()
{
    return g_pid;
}


void *G_Thread::threadFun(void *arg)
{
    G_Thread *pThread = (G_Thread*)arg;
    pThread->Run();
}

bool G_Thread::Start()
{
    int nRet = pthread_create(&g_pid , NULL , threadFun , this);
    if(0 == nRet)
    {
        nRet = pthread_detach(g_pid);
        if(nRet == 0)
        {
            return true;
        }
    }
    else
    {
        return false;
    }

    return true;
}

void G_Thread::pause()
{
    int sig;
    sigwait(&g_waitSig , &sig);
}

void G_Thread::continues()
{
    pthread_kill(g_pid , SIGUSR1);
}

论坛徽章:
0
10 [报告]
发表于 2007-05-30 16:18 |只看该作者
在一个FIFO上调用read,write,select 都可以将控制权交回给系统,空闲时不会占用CPU时间
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP