作業項目のキューを処理するワーカー スレッドがあります。に挿入されたアイテムを処理する 2 番目のワーカーを実装しましたworker1
。Invalid reads
ただし、 Valgrind を使用しているときにいくつか出くわしました。
これは、メインスレッドのある時点でstruct foo
渡されたものが解放されたためだと思います。worker2()
基本的には、常に更新される構造体 (malloc/free) ですが、不足している項目をいくつか挿入しstruct foo
たいと思います。worker2
foo
私の質問は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);
}