方案1:条件变量
条件等待pthread_cond_wait()
代码示例[1]
#include <unistd.h>
#include <pthread.h>
static pthread_mutex_t mutex;
static pthread_cond_t cond;
static int flag = 0;
void srpthread_init()
{
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
}
void srpthread_suspend()
{
pthread_mutex_lock(&mutex);
flag--;
pthread_mutex_unlock(&mutex);
}
void srpthread_resume()
{
pthread_mutex_lock(&mutex);
flag++;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
void *thread_run()
{
while(1)
{
pthread_mutex_lock(&mutex);
while(flag<=0)
{
pthread_cond_wait(&cond,&mutex);
}
pthread_mutex_unlock(&mutex);
//actual work
printf("i am running!\n");
}
}
int main(int argc,char *argv[])
{
char ch;
pthread_t p1;
srpthread_init();
pthread_create(&p1,NULL,(void *)thread_run,NULL);
while(1)
{
scanf("%c",&ch);
switch(ch)
{
case 's':
srpthread_suspend();
break;
case 'r':
srpthread_resume();
break;
default:
break;
}
}
#if 0
printf("1111\n");
srpthread_resume();
printf("2222\n");
sleep(3);
printf("3333\n");
srpthread_suspend();
printf("4444\n");
#endif
return 1;
}
记时等待pthread_cond_timedwait()
略,类似pthread_cond_wait()
方案2:信号量
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
具体应用很简单,可查阅相关资料
方案3:用select让线程沉睡
代码示例[2]
void thread_sleep(unsigned long sleepSecond)
{
#if (APP_USE_SYS == APP_SYS_LINUX)
timeval t_timeval;
t_timeval.tv_sec = (sleepSecond / 1000);
t_timeval.tv_usec = (sleepSecond % 1000);
select(0, NULL, NULL, NULL, &t_timeval);
#else
Sleep(sleepSecond);
#endif
return;
}
参考文献
[1] https://blog.csdn.net/honghuzhilangzixin/article/details/7908236
[2] https://bbs.csdn.net/wap/topics/360129370