0

スレッドをミューテックスで終了したい。最初のスレッドは実行されず、スレッド 2 と 3 が実行されます。

この問題が何であるか知っている人はいますか?スレッド 1 が実行されても、2 または 3 が実行されないことがあります。ここで何が問題なのかわかりません。

Thread created successfully
    Thread created successfully
    Thread created successfully
    ----------------------------------------------------
    J:0
    NUM_REQUESTS (before function): 0
    J:0
    ----------------------------------------------------
    ----------------------------------------------------
    J:1
    Third thread processing done
    WRITE DATA TO LIST!
    NUM_REQUESTS(function): 1
    NUM_REQUESTS (before function): 0
    J:1
    ----------------------------------------------------
    ----------------------------------------------------
    J:2
    Second thread processing done
    WRITE DATA TO LIST!
    NUM_REQUESTS(function): 0
    NUM_REQUESTS (before function): 0
    J:2
    ----------------------------------------------------

プログラム:

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

pthread_mutex_t request_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t got_request = PTHREAD_COND_INITIALIZER;

pthread_t tid[3];
int thr_id[3];
int ret1,ret2,ret3;
int i = 0;
int err;
int *ptr[2];
int num_requests = 0;
int rc = 0;

これはスレッドの機能です。最初のスレッドは実行されません!

void* doSomeThing(void *arg)
{
    unsigned long i = 0;
    pthread_t id = pthread_self();

    for(i=0; i<1000000;i++);

    if(pthread_equal(id,tid[0]))
    {
         printf("First thread processing done\n");
         printf("WRITE DATA TO LIST!\n");
         num_requests--;
         printf("NUM_REQUESTS(function): %d\n",num_requests);
         rc = pthread_mutex_unlock(&request_mutex);
         pthread_exit(&tid[0]);
    }else if(pthread_equal(id,tid[1])){

        printf("Second thread processing done\n");
        num_requests--;
        printf("WRITE DATA TO LIST!\n");
        printf("NUM_REQUESTS(function): %d\n",num_requests);
        rc = pthread_mutex_unlock(&request_mutex);
        pthread_exit(&tid[1]);
    }else if(pthread_equal(id,tid[2])){

        printf("Third thread processing done\n");
        printf("WRITE DATA TO LIST!\n");
        printf("NUM_REQUESTS(function): %d\n",num_requests);
        num_requests--;
        rc = pthread_mutex_unlock(&request_mutex);
        pthread_exit(&tid[2]);
    }
    return NULL;
}

これは、スレッドの出力を作成する場所です

void add_request(int j,pthread_mutex_t* p_mutex,pthread_cond_t* p_cond_var)
{
    printf("----------------------------------------------------\n");
    printf("J:%d\n",j);
    if(num_requests > 3){
        printf("WAIT TILL THREADS ARE FREE!\n");
    }else{

    rc = pthread_mutex_lock(&request_mutex);
    printf("NUM_REQUESTS (before function): %d\n",num_requests);    

    num_requests++;
    rc = pthread_mutex_unlock(&request_mutex);

    rc = pthread_mutex_lock(&request_mutex);
    rc = pthread_cond_signal(p_cond_var);
    printf("J:%d\n",j);
    printf("----------------------------------------------------\n");
    }
}

メインでは、スレッドのみを作成し、 add_request 関数を使用してスレッドを実行します

int main(void)
{
    //create 3 threads
    while(i < 3)
    {
    thr_id[i] = i;
        err = pthread_create(&(tid[i]), NULL, &doSomeThing, (void*)&thr_id[i]);
        if (err != 0)
            printf("can't create thread :[%s]", strerror(err));
        else
            printf("Thread created successfully\n");

        i++;
    }    

    int j;
    for(j=0;j<3;j++){
    add_request(j, &request_mutex, &got_request);
    }


    return 0;
}
4

1 に答える 1

1

あなたは何をしようとしているのですか?

少なくとも1つの問題は、ミューテックスをロックせずにロックを解除することです...

スレッドを作成すると、スレッドは自発的に (多かれ少なかれ) 開始されるため、 doSomething() の後に add_request が呼び出されるとは想定できません

ロックしてからロック解除できます。ptheard_joinスレッドが終了するまで待ちたい場合にも使用を検討してください。

編集これはあなたがやり たいこと ですhttps://computing.llnl.gov/tutorials/pthreads/samples/condvar.c

幸運を

于 2013-05-12T09:02:45.543 に答える