zoukankan      html  css  js  c++  java
  • Linux中线程的挂起与恢复(进程暂停)

    http://www.linuxidc.com/Linux/2013-09/90156.htm

    今天在网上查了一下Linux中对进程的挂起与恢复的实现,相关资料少的可怜,大部分都是粘贴复制。也没有完整详细的代码。故自己整理了一下

    程序流程为:主线程创建子线程(当前子线程状态为stop停止状态),5秒后主线程唤醒子线程,10秒后主线程挂起子线程,15秒后主线程再次唤醒子线程,20秒后主线程执行完毕等待子线程退出。

    代码如下:
    #include
    #include
    #include
    #include
    #include


    #define RUN 1
    #define STOP 0


    pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
    pthread_cond_t cond = PTHREAD_COND_INITIALIZER;


    int status = STOP;
    void * thread_function(void)
    {
        static int i = 0;
        while (1) 
        {  
            pthread_mutex_lock(&mut);
            while (!status)
            {
                pthread_cond_wait(&cond, &mut);
            }
            pthread_mutex_unlock(&mut);
        
            printf("child pthread %d ", i++);
            if (i == 20) 
                break;
            sleep(1);
        }  
    }


    void thread_resume()
    {
        if (status == STOP)
        {  
            pthread_mutex_lock(&mut);
            status = RUN;
            pthread_cond_signal(&cond);
            printf("pthread run! ");
            pthread_mutex_unlock(&mut);
        }  
        else
        {  
            printf("pthread run already ");
        }  
    }


    void thread_pause()
    {
        if (status == RUN)
        {  
            pthread_mutex_lock(&mut);
            status = STOP;
            printf("thread stop! ");
            pthread_mutex_unlock(&mut);
        }  
        else
        {  
            printf("pthread pause already ");
        }
    }


    int main()
    {
        int err;
        static int i = 0;
        pthread_t child_thread;


    #if 0
        if (pthread_mutex_init(&mut, NULL) != 0)
            printf("mutex init error ");
        if (pthread_cond_init(&cond, NULL) != 0)
            printf("cond init error ");
    #endif


        err = pthread_create(&child_thread, NULL, (void *)thread_function, NULL);
        if (err != 0 )
            printf("can't create thread: %s ", strerror(err));
        while(1)
        {
            printf("father pthread %d ", i++);
            sleep(1);
            if (i == 5)
                thread_resume();
            if (i == 10)
                thread_pause();
            if (i == 15)
                thread_resume();
            if (i == 20)
                break;
        }
        if (0 == pthread_join(child_thread, NULL))
            printf("child thread is over ");
        return 0;
    }

    相关阅读:

    对Linux中多线程编程中pthread_join的理解 http://www.linuxidc.com/Linux/2013-09/89931.htm

    Linux多线程编程时如何查看一个进程中的某个线程是否存活 http://www.linuxidc.com/Linux/2013-09/89930.htm

    有关Linux下线程的创建 http://www.linuxidc.com/Linux/2013-08/88530.htm

    Linux内核线程死锁或死循环之后如何让系统宕机重启 http://www.linuxidc.com/Linux/2013-04/82063.htm

    Linux下C语言实现多线程文件复制 http://www.linuxidc.com/Linux/2013-03/81373.htm

  • 相关阅读:
    Python之图片格式转换
    pip依赖安装与记录
    Spectral Graph Theory的一些定理
    Beamer加中文
    Python之json
    Windows之建立C++开发环境
    Mysql分表教程
    null和空 not null
    yii 隐藏index.php的步骤
    yii泛域名
  • 原文地址:https://www.cnblogs.com/kex1n/p/5588845.html
Copyright © 2011-2022 走看看