首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问怎么用pthread库实现线程的启动和暂停

2013-01-07 
请教如何用pthread库实现线程的启动和暂停?我在linux上,想用pthread库实现这样的功能:我有2个线程:一个主

请教如何用pthread库实现线程的启动和暂停?
我在linux上,想用pthread库实现这样的功能:我有2个线程:一个主线程,一个工作线程,在主线程中创建工作线程。工作线程不总是工作,也就是说,创建的时候处于暂停状态或休眠状态(不占cpu),当主线程通知它工作的时候就开始工作。开始工作之后,当主线程需要暂停它的时候可以通知它使它暂停。然后工作线程又处于暂停状态(不占cpu)。之后类似,主线程可以随时通知工作线程开始工作,随时暂停工作线程。
我开始的想法是这样的:

pthread_t thread;
int enable = 0;

void* threadFunc(void* args)  //工作线程函数
{
   while(1)
   {
      if(enable)
      {
          work();
      }
      else
      {  
          sleep(1);
      }
   }
   return ((void*)0);
}

int main()
{
     pthread_create(&thread, NULL, threadFunc, NULL);
     enable = 1;
     sleep(3);
     enable = 0;
     ...
}


但感觉用sleep不太好,因为sleep的时间其实不好定。太长太短都不好。其实主线程什么时候启动什么时候暂停工作线程,都是确定的。主线程其实是响应用户的请求,用户说开始work就应该马上work,用户说停止就应该马上停止。
后来我想用条件变量,在工作线程中:

pthread_mutex_lock(&mutex));
pthread_cond_wait(&cond,&mutex);
 
在主线程中:

pthread_cond_signal(&cond);


但是这样只能启动,无法暂停?

不知道各位大侠有没有什么办法?代码应该如何写呢?
多谢了! 


[解决办法]
linux下好像没有如Windows下的线程suspend,resume机制。
只能通过你所说的pthread_mutex_lock,pthread_cond_wait等函数实现。

启动控制应该跟你最开始的思路一样,还得需要循环检测,就是把你的enable换成pthread_cond_wait,不需要sleep就是了。
[解决办法]
在工作线程中合适的地方加锁读取一个初值为0的全局变量,如果该全局变量为1,表示主线程希望本子线程暂停;
主线程希望子线程暂停时,加锁设置这个全局变量为1?
[解决办法]
哦。原来是这种需求。
还是按你的思路,把两种方法结合一下。
子线程,判断还是使用enable,但是sleep用pthread_cond_wait来。
主线程,启动的时候先设定Enable=true然后pthread_cond_signal。
             停止的时候直接设定Enable=false
但是enable原子操作(atomic_t)来实现安全些。
[解决办法]
#include <stdio.h>   
#include <pthread.h>   
#include <stdlib.h>   
#include <unistd.h>   
  
pthread_mutex_t mutex_pause = PTHREAD_MUTEX_INITIALIZER;  
pthread_cond_t cond_pause = PTHREAD_COND_INITIALIZER;  
  
bool pthread_pause = false;  
  
void pthread_suspend(void)  
{  
    if (pthread_pause == false)  
    {  
        pthread_mutex_lock( &mutex_pause );  
        pthread_pause = true;  
        printf("------pthread pause------/n");  
        pthread_mutex_unlock( &mutex_pause );      
    }  
    else  
    {  


        printf("pthread suspend already/n");  
    }  
  
}  
  
  
void pthread_resume(void)  
{   
    if (pthread_pause == true)  
    {  
        pthread_mutex_lock(&mutex_pause);  
        pthread_pause = false;  
        pthread_cond_broadcast(&cond_pause);  
        printf("------pthread resume------/n");  
        pthread_mutex_unlock(&mutex_pause);   
    }  
    else  
    {  
        printf("pthread resume already/n");  
    }  
  
  
}  
  
  
void pthread_pause_location(void)  
{  
    pthread_mutex_lock(&mutex_pause);  
    while(pthread_pause)  
    {  
        pthread_cond_wait(&cond_pause, &mutex_pause);  
    }  
    pthread_mutex_unlock(&mutex_pause);   
}  


[解决办法]
我来帮你拼接一下。

pthread_mutex_t mutex_pause = PTHREAD_MUTEX_INITIALIZER;  
pthread_cond_t cond_pause = PTHREAD_COND_INITIALIZER;  
   
bool pthread_pause = false;  
   
void pthread_suspend(void)  
{  
    if (pthread_pause == false)  
    {  
        pthread_mutex_lock( &mutex_pause );  
        pthread_pause = true;  
        printf("------pthread pause------/n");  
        pthread_mutex_unlock( &mutex_pause );      
    }  
    else  
    {  
        printf("pthread suspend already/n");  
    }  
   
}  
   
   
void pthread_resume(void)  
{   
    if (pthread_pause == true)  
    {  
        pthread_mutex_lock(&mutex_pause);  
        pthread_pause = false;  
        pthread_cond_broadcast(&cond_pause);  
        printf("------pthread resume------/n");  
        pthread_mutex_unlock(&mutex_pause);   


    }  
    else  
    {  
        printf("pthread resume already/n");  
    }  


void* threadFunc(void* args)  //工作线程函数 
{    
    while(1)    
    {       
        if(pthread_pause == false)       
        {     work();       
        }       
        else      
        {             
           pthread_cond_wait(&cond);
        }    
     }    
     return ((void*)0); 
}   
 
int main() 
{      
      pthread_create(&thread, NULL, threadFunc, NULL);      
      pthread_resume();     
      pthread_cond_signal(&cond);
      sleep(3);
      pthread_suspend();      
      ... 
}
[解决办法]

引用
能不能写个例子?
 

你自己的就可以啊,


void* threadFunc(void* args)  //工作线程函数
{
   while(1)
   {
      if(!pthread_pause)
      {
printf("working...");
          //work();
      }
      else
      {  
printf("rest...");
      }
sleep(1);
   }
   return ((void*)0);
}
pthread_t thread;

int main()
{
     pthread_create(&thread, NULL, threadFunc, NULL);

 while (1){
 int c = getchar();
 if (c=='s') pthread_suspend();
 if (c=='r') pthread_resume();
 //if (c=='c') pthread_pause_location();
 }
 return 0;
}

热点排行