我试图找到一种简单的方法来睡眠或停止执行,并在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); 部分使用哪些功能。
答案 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)
你不能睡觉也不能从外面唤醒线程。此外,任何需要此功能的设计都会被破坏。为什么你需要让线程进入睡眠状态?你需要的是线程之间的正确同步点,这样线程就会在没有工作的时候等待。