Pthread和键盘

时间:2013-03-09 05:29:08

标签: c++ keyboard pthreads

我想知道每次按一个键时如何运行一个线程来休眠一段时间。例如,如果我按两次相同的键,它应该有两个线程可以休眠一段时间。

必须使用 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);

}

1 个答案:

答案 0 :(得分:1)

  1. 因为你想在每次按键时创建一个线程,并且按键处理程序在executer中,你应该移动代码在executer2中创建executer }。

  2. executersleep 1秒。看完按键后,但似乎不是你想要的。只需删除对sleep(1)的调用即可获得即时回复

  3. 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变量。

  4. 您当前正在使用互斥锁来锁定executer2的代码。这将防止所有睡眠线程同时睡在一起。您将不得不移除锁以允许它们同时睡眠(但保留文本输出周围的锁)。

  5. 你说你想要一个C ++解决方案。您可以从使用stl中的线程库中受益,该线程库使用更高级别的构造包装OS线程基元(在您的情况下为pthread)并且更易于操作,尤其是对于参数。在您使用当前代码后,将程序转换为使用此库是一个很好的练习。