我想知道每次按一个键时如何运行一个线程来休眠一段时间。例如,如果我按两次相同的键,它应该有两个线程可以休眠一段时间。
我必须使用 pthreads 和 C ++ 。
老实说,我尝试了很多方法,但我仍然不知道如何解决它。
对不起,如果我的英语不是很好:)
更新
这是我的代码:
#include <pthread.h>
#include <iostream>
#include <unistd.h>
using namespace std;
pthread_mutex_t mutex;
pthread_cond_t cond;
int a;
void* executer2(void*)
{
pthread_mutex_lock(&mutex);
while (a > 0) {
pthread_cond_wait(&cond, &mutex);
}
cout << "Thread: " << pthread_self() << endl;
sleep(a);
pthread_mutex_unlock(&mutex);
}
void* executer(void*)
{
int key;
while (1) {
pthread_mutex_lock(&mutex);
key = cin.get();
if (key == 'a') {
cout << "Sleep for 4 seconds" << endl;
a = 4;
} else if (key == 'b') {
cout << "Sleep for 8 seconds" << endl;
a = 8;
} else {
cout << "Sleep for 2 seconds" << endl;
a = 2;
}
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
int main()
{
pthread_t tr, t;
pthread_attr_t attr;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_create(&tr, &attr, executer, NULL);
pthread_create(&t, &attr, executer2, NULL);
pthread_join(tr, NULL);
pthread_join(t, NULL);
}
答案 0 :(得分:1)
因为你想在每次按键时创建一个线程,并且按键处理程序在executer
中,你应该移动代码在executer2
中创建executer
}。
executer
到sleep
1秒。看完按键后,但似乎不是你想要的。只需删除对sleep(1)
的调用即可获得即时回复
executer
的代码似乎表明您希望根据输入密钥调整线程休眠所花费的时间。您可以将休眠时间作为参数传递给executer2
,如该函数的void *
参数所示。我的想法是将时间值转换为void *
,在创建线程时传递它,然后在executer2
内将其强制转换为int:
// executer2 thread creation
pthread_create(&t, &attr, executer2,(void *)a);
和executer2
:
void *executer2(void *arg){
int a = (int)arg;
// ...
线程创建代码应该在executer2
之后切换,您不再需要全局a
变量。
您当前正在使用互斥锁来锁定executer2
的代码。这将防止所有睡眠线程同时睡在一起。您将不得不移除锁以允许它们同时睡眠(但保留文本输出周围的锁)。
你说你想要一个C ++解决方案。您可以从使用stl中的线程库中受益,该线程库使用更高级别的构造包装OS线程基元(在您的情况下为pthread)并且更易于操作,尤其是对于参数。在您使用当前代码后,将程序转换为使用此库是一个很好的练习。