0

アイテムをキューに追加し、何かがキューにあるときにそれらを削除するスレッドが必要です。私は、スタックから何かを取り出してから、10 秒ほど待ってから、もう一度実行するというアプローチをとっていました。それをスレッドに投げ込む方法がわかりません。PuTTy で C を使用しています。私は機能を否定しました。スペースを節約するために thme をコピーしたくありませんでした。delete() 最初のものを削除するだけです。スレッドを10秒間一時停止するにはどうすればよいですか。Sleep は実際にコマンド ウィンドウを一時停止します。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <conio.h>

#define MAXQUEUE 100

    struct queue 
    {
        char name[256];
        struct queue *link;
    };

void *thread_routine(void *arg) {
    int tr;
    while(tr!=0) {
        sleep(10);
        delete();
    }

}

struct queue *start=NULL;

int i=0;

void main() {

    pthread_t thread1;
    pthread_t thread2;
    void *thread_result;
    int status;
    status = pthread_create(&thread1, NULL, thread_routine, NULL);
    if (status != 0) {
        printf ("thread create failed\n");
        exit(1);
    }
    /* wait for the thread to finish */

    status = pthread_join(thread1, &thread_result);
    if (status != 0) {
        printf ("thread join failed\n");
        exit(1);
    }
    printf ("child thread finished: result = %d\n", (int) thread_result);

    int ch;
    while(ch!=4) {
        printf("\nSelect an option:\n");
        printf("1 to add an item to the queue\n");
        //printf("2 to delete an item from the queue\n");
        printf("3 to print the queue\n");
        printf("4 for Exit\n");
        scanf("%d",&ch);
        switch(ch) {
            case 1: 
                add();
                break;
            case 2: 
                delete();
                break;
            case 3: 
                print();
                break;
            case 4: 

                break;
            default:
                printf("Incorrect option\n");
                break;
        }
    }
}
4

2 に答える 2

1

Sleep は実際にコマンド ウィンドウを一時停止します。

これは、スレッドが終了するのを待ってスレッドに参加したためです。スレッドを切り離したままにして、おそらくオプションを読み取るための無限ループを作成します。

また、新しいアイテムが挿入されたときにスレッドに通知するために、ミューテックスと条件変数を使用することをお勧めします。ただし、「スリープ」の方法で行うと機能するはずですが、期待どおりにアイテムをすぐに削除することはおそらくありません。

于 2013-08-06T03:11:13.463 に答える
0

シグナルのハンドラーを設定するだけでなく、アラームシグナルを使用してsleep().、スレッドがそれをブロックしないようにすることもできます。

于 2013-08-06T03:15:55.107 に答える