-1

我想知道每次按下某个键时如何让线程休眠一段时间。例如,如果我按同一个键两次,它应该有两个线程休眠一段时间。

必须使用pthreadsC++

老实说,我尝试了很多方法,但我仍然不知道如何解决它。

对不起,如果我的英语不是很好:)

更新

这是我的代码:

#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);

}
4

1 回答 1

1
  1. 由于您想在每次按键时创建一个线程,并且按键处理程序位于 中executer,因此您应该将代码移动到executer2executer.

  2. executersleep1秒。阅读按键后,但这似乎不是您想要的。只需删除该呼叫即可sleep(1)获得立即响应

  3. 的代码executer似乎表明您希望根据输入键调整线程睡眠所花费的时间。您可以将睡眠时间作为参数传递给executer2,如void *该函数的参数所示。想法是将时间值转换为 a void *,在线程创建时将其传递,然后将其转换回 int 内executer2

    // executer2 thread creation 
    pthread_create(&t, &attr, executer2,(void *)a);
    

    并在executer2

    void *executer2(void *arg){
        int a = (int)arg;
        // ...
    

    线程创建代码应该在 switch in 之后进行executer2,并且您不再需要全局a变量。

  4. 您当前正在使用互斥锁来锁定executer2. 这将防止所有休眠线程同时休眠。您必须移除锁以允许它们同时休眠(但将锁留在文本输出周围)。

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

于 2013-03-09T14:39:08.390 回答