0

実装されたプールを介して作成とキャンセルを使用しようとしているプログラムがあります。

作成は次のとおりです。

int threadsNum=10;
while (created<threadsNum){
    pthread_t newThread;
    pthread_struct *st; //Open the thread that handle the deleting of the sessions timeout.
    st = (pthread_struct*)malloc(sizeof(pthread_struct));
    st->id = created;
    st->t = newThread;
    pthread_mutex_lock( &mutex_threadsPool );
    readingThreadsPool[created] = st;
    pthread_mutex_unlock( &mutex_threadsPool );
        if((threadRes1 = pthread_create( &newThread, NULL, pcapReadingThread, (void*)created)))
        {
        syslog(LOG_CRIT, "Creating Pcap-Reading Thread %d  failed.",created); 
                printf( "Creating Pcap-Reading Thread %d  failed.\n",created);
                exit(1);
        }
    syslog(LOG_INFO, "Created Pcap-Reading Thread %d Successfully.",created); 
    created++;
}

後でキャンセルして再起動しようとします:

    pthread_t t;
pthread_struct* tstr;
int i;
pthread_mutex_unlock( &mutex_threadsPool );
//first go on array and kill all threads
for(i = 0; i<threadsNum ; i++ ){
    tstr = readingThreadsPool[i];
    if (tstr!=NULL){
        t = tstr->t;
        if (pthread_cancel(t)!=0){
            perror("ERROR : Could not kill thread");
        }
        else{
            printf("Killed Thread %d \n",i);
        }
    }
}

ここまでは順調ですが、唯一の問題は、出力が Error : Could not kill thread : Illegal Seek Killed Thread 1 であることです。

殺されたスレッド 2

殺されたスレッド 3

殺されたスレッド 4

殺されたスレッド 5

殺されたスレッド 6

殺されたスレッド 7

殺されたスレッド 8

殺されたスレッド 9

0 インデックスのスレッドも強制終了しないのはなぜですか?

Illegal Seek については何も見つかりませんでした..

助けてくれてありがとう

ありがとう

4

1 に答える 1

1

問題は、newThread初期化される前に使用されていることです。

pthread_t newThread;
pthread_struct *st;
st = (pthread_struct*)malloc(sizeof(pthread_struct));
st->id = created;
st->t = newThread;

の呼び出しがnewThread成功するまで値を受け取りませんpthread_create()。variable は、ループの後続の繰り返しで以前の値を保持しているように見えます。その結果、id が配列newThreadに挿入されないため、最後に開始されたスレッドを除くすべてのスレッドが正しくキャンセルされます。readingThreadsPool

st->tを呼び出した後、メンバーを設定する必要がありますpthread_create()

現在のコードでは、readingThreadsPool実際にはまだスレッドになっていないエントリが配列に挿入される可能性があります。への呼び出しの後に挿入ロジックを配置しますpthread_create()

if((threadRes1 =
        pthread_create(&(st->t), NULL, pcapReadingThread, (void*)created)))
{
    syslog(LOG_CRIT, "Creating Pcap-Reading Thread %d  failed.",created); 
    printf( "Creating Pcap-Reading Thread %d  failed.\n",created);
    exit(1);
}
pthread_mutex_lock( &mutex_threadsPool );
readingThreadsPool[created] = st;
pthread_mutex_unlock( &mutex_threadsPool );

または、関数が自分自身のエントリにpcapReadingThread()アクセスして期待している場合 (渡されたことが原因である可能性があると思います) 、 のロック内にを囲みます。readingThreadsPoolcreatedpthread_create()mutex_threadsPool

于 2012-11-20T16:05:13.850 に答える