Pthread条件睡眠?

时间:2015-09-24 17:40:04

标签: multithreading pthreads conditional sleep

我试图找到一种简单的方法来睡眠或停止执行,并在C中唤醒另一个(所以不是调用的)线程。 它应该像这样工作:

main()
{
    int msg = 0;
    ptread_t t;
    pthread_create(&t, NULL, work, NULL)
    while(1)
    {
        msg = recieve_msg();
        switch(msg)
        case 1:
             //sleep_pthread(t);
             break;
        case 2:
             //wake_pthread(t);
             break;
        default:
             break;
    }
}

void work()
{ //do whatever it needs to
}

recieve_msg()等待用户操作,所以我不知道有多少时间我必须停止执行该线程。 我需要帮助的地方是我应该为那些 sleep_pthread(t); wake_pthread(t); 部分使用哪些功能。

2 个答案:

答案 0 :(得分:1)

从你所说的"找到一种简单的方法来睡觉或停止执行,并在C&#34中唤醒另一个(所以不是调用的)线程。 - 您的要求似乎建议您需要简单的pthread_cond_wait或pthread_cond_timedwait来满足您的需求。通过使用它们,你迫使它们进入睡眠状态直到条件不满足或计时器到期。

以下是示例代码

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

#define WAIT_TIME_SECONDS  15
typedef struct mystruct_tag
{
    pthread_mutex_t  mutex;
    pthread_cond_t   cond;
    int              value;
} mystruct_t;

mystruct_t data = {PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0};

/* 
 * thread start routine. It will set the main thread's predicate and 
 * signal the condition variable
 */

 void *wait_thread (void *arg)
 {
     int status;
     long sleep_time = (long)arg;

     status = pthread_mutex_lock(&data.mutex);
     if (status != 0)
     {
         printf(" failed \n");
     }
     sleep(sleep_time);
     data.value = 1;  /*set predicate */
     status = pthread_cond_signal (&data.cond);

     if (status != 0)
     {
         printf(" failed at condition \n");
     }

     status = pthread_mutex_unlock (&data.mutex);

     return NULL;
 }

 int main (void)
 {
     int status;
     pthread_t wait_thread_id;
     struct timespec timeout;
     struct timeval    tp;

     pthread_create(&wait_thread_id, NULL, wait_thread, (void *)50);

     timeout.tv_sec  = tp.tv_sec;
     timeout.tv_nsec = 0;
     timeout.tv_sec += WAIT_TIME_SECONDS;

     pthread_mutex_lock(&data.mutex);

     while(data.value == 0)
     {
         pthread_cond_timedwait (&data.cond, &data.mutex, &timeout); /*can use cond_wait too instead of timedwait*/
     }     
     status = pthread_mutex_unlock(&data.mutex);

     return 0;
 }

答案 1 :(得分:0)

你不能睡觉也不能从外面唤醒线程。此外,任何需要此功能的设计都会被破坏。为什么你需要让线程进入睡眠状态?你需要的是线程之间的正确同步点,这样线程就会在没有工作的时候等待。