2

作業項目のキューを処理するワーカー スレッドがあります。に挿入されたアイテムを処理する 2 番目のワーカーを実装しましたworker1Invalid readsただし、 Valgrind を使用しているときにいくつか出くわしました。

これは、メインスレッドのある時点でstruct foo渡されたものが解放されたためだと思います。worker2()基本的には、常に更新される構造体 (malloc/free) ですが、不足している項目をいくつか挿入しstruct fooたいと思います。worker2foo

私の質問はworker2、すぐに処理を停止することは可能struct fooですNULLか? create_foo()が呼び出されたときにもう一度開始しますか?foo不足しているアイテムをスレッドで挿入するための最良の方法が何であるかわかりませんか? フィードバックをお待ちしております。

//canonical form
//producer
void push_into_queue(char *item)
{
    pthread_mutex_lock(&queueMutex);
    if (workQueue.full) {       // full }
        else
        {
            add_item_into_queue(item);
            pthread_cond_signal(&queueSignalPush);
        }
        pthread_mutex_unlock(&queueMutex);
    }
}

// consumer1
void *worker1(void *arg)
{
    while (true) {
        pthread_mutex_lock(&queueMutex);
        while (workQueue.empty)
            pthread_cond_wait(&queueSignalPush, &queueMutex);

        item = workQueue.front; // pop from queue
        add_item_into_list(item);

        pthread_cond_broadcast(&queueSignalPop);
        pthread_mutex_unlock(&queueMutex);
    }
    return NULL;
}

pthread_create(&thread1, NULL, (void *) &worker, NULL);

// consumer2
void *worker2(void *arg)
{
    my_struct *foo = (my_struct *) arg;
    while (true) {
        pthread_mutex_lock(&queueMutex);
        while (list.empty)
            pthread_cond_wait(&queueSignalPop, &queueMutex);

        for (i = 0; i < list.size; i++)
            insert_item_into_foo(list[i].item, foo);
        pthread_cond_broadcast(&queueSignalPop);
        pthread_mutex_unlock(&queueMutex);
    }
    return NULL;
}

void create_foo()
{
    my_struct *foo = calloc(10, sizeof(my_struct));
    pthread_create(&thread2, NULL, (void *) &worker2, foo);
}

void free_foo()
{
    pthread_mutex_lock(&queueMutex);
    int i;
    for (i=0; i<5; i++)
       free(foo[i].list->string);
    free(foo[i].list);
    free(foo);
    pthread_mutex_unlock(&queueMutex);
}
4

2 に答える 2