到目前为止,我终于为我正在制作的一些测试应用程序创建了一个准确的消费者-生产者类型模型,但最后一点给我带来了一些问题。
我为我的应用程序设置了 2 个结构。一个用于链接列表,用作必须完成的工作列表。另一个是特定于每个线程的结构,其中包含指向链表的双指针。我不使用单个指针,因为我无法在一个线程中修改指针并检测另一个线程中的更改。
//linked list struct:
typedef struct list_of_work list_of_work;
struct list_of_work {
// information for the work
list_of_work *next;
};
//thread struct:
typedef struct thread_specs {
list_of_work **linked_list;
unsigned short thread_id;
pthread_mutex_t *linked_list_mtx;
} thread_specs;
中的双指针thread_specs
绑定到结构根的双指针,list_of_work
如下所示:
主要:
list_of_work *root;
list_of_work *traveller;
pthread_t thread1;
thread_specs thread1_info;
// allocating root and some other stuff
traveller = root;
thread1_info.linked_list = &traveller;
这一切都没有警告或错误。
现在我继续创建我的pthread:
pthread_create(&thread1, NULL, worker, &thread1_info )
在我的 pthread 中,我执行 2 次转换,1 次转换 thread_info 结构,另一个转换链表。ptr 是我的论点:
thread_specs *thread = (thread_specs *)ptr;
list_of_work *work_list = (list_of_work *)thread->linked_list;
list_of_work *temp;
这不会引发任何错误。
然后我有一个名为list_of_work *get_work(list_of_work *ptr)
的函数,该函数有效,所以我不会发布整个内容,但正如您所看到的,它希望看到一个指向链表的指针,它返回同一个链表的指针(或者NULL
或者是下一件作品)。
所以我使用这个函数来完成下一个这样的工作:
temp = get_work(*work_list);
if (temp != NULL) {
work_list = &temp;
printf("thread: %d || found work, printing type of work.... ",thread->thread_id);
}
现在这是症结所在。我怎样才能正确地将指针转换并传递给我的函数的第一个指针后面的指针,get_work()
以便它可以做它所做的事情。
我的编译器发出警告:
recode.c:348:9: error: incompatible type for argument 1 of ‘get_work’
recode.c:169:14: note: expected ‘struct list_of_work *’ but argument is of type ‘list_of_work’
我感谢谁能帮助我!