-1

キーを押すたびにスレッドを実行してスリープ状態にする方法を知りたいです。たとえば、同じキーを2回押すと、しばらくスリープするスレッドが2つあるはずです。

pthreadC++を使用する必要があります。

正直なところ、私は多くの方法を試しましたが、それを解決する方法がまだわかりません。

私の英語があまり上手ではない場合は申し訳ありません:)

アップデート

これは私のコードです:

#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 *ます。アイデアは、時間値をにキャストし、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)をより高いレベルの構造でラップし、特にパラメーターの操作が簡単になるというメリットがあります。現在のコードが機能するようになったら、このライブラリを使用するようにプログラムを変換することをお勧めします。

于 2013-03-09T14:39:08.390 に答える