到目前为止,我已经为我正在制作的一些测试应用程序创建了一个准确的消费者 - 生产者类型模型,但最后一点导致了一些问题。
我的应用程序有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
结构的根的双指针,如下所示:
在main中:
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);
}
现在这是关键。我如何正确地转换并传递指针BEHIND指向我的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’
我感谢能帮助我的人!
答案 0 :(得分:0)
根据你发布的函数get_work()
的定义和错误消息,这个问题在这里:
temp = get_work(work_list);
^
/* Notice there's no dereferencing here */
函数需要指针到struct list_of_work
,而你传递struct list_of_work
。