所以,我在结构列表中找到当前线程id非常糟糕,它反映了有关线程的信息。
基本上,列表中的每个元素都有一个字段pthread_t id
。我的搜索功能类似于:
int thread_pos(pthread_t tid)
{
int i;
for (i = 0; i < my_threads.thread_num; i++)
{
printf("for: %d %d %d\n", my_threads.vector[i].id, tid, pthread_equal(my_threads.vector[i].id, tid));
if (pthread_equal(my_threads.vector[i].id, tid))
{
printf("found\n");
return i;
}
}
return -1;
}
由于my_threads.vector中只有1个元素,因此会打印一行:
419817216 419817216 0
数据结构:
struct my_thread_t
{
pthread_t id;
};
struct my_threads_t
{
struct my_thread_t vector[100];
int thread_num;
};
我以这种方式添加元素:
pthread_create(&new_tid, NULL, start_thread, &my_threads.vector[my_threads.thread_num].thread_arg);
my_threads.vector[my_threads.thread_num].id = new_tid;
my_threads.thread_num++;
问题是,虽然元素存在,但在列表中却无法找到它。我在每次比较中打印了一行(例如419817216 419817216 0
,显示了列表中的tid,关键tid和pthread_equal的结果)。如您所见,数值表示是相同的,但不知何故pthread_equal表示它们不是。
我缺少什么?
答案 0 :(得分:2)
如果从不同的线程向my_threads
添加/删除/检查元素,一切都会变得疯狂。
从您的代码片段中我怀疑您没有mutex对此结构的保护。
如果您确实没有实现锁定并且需要比写入更频繁地阅读列表,请考虑pthread_rwlock()接口。
更新:您还可以在平台上查看sizeof(pthread_t)
吗?如果为8(无符号长整数),则至少应使用%lu格式in
printf。