Linux线程id比较

时间:2013-05-19 19:09:59

标签: c linux multithreading pthreads

所以,我在结构列表中找到当前线程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表示它们不是。

我缺少什么?

1 个答案:

答案 0 :(得分:2)

如果从不同的线程向my_threads添加/删除/检查元素,一切都会变得疯狂。 从您的代码片段中我怀疑您没有mutex对此结构的保护。

如果您确实没有实现锁定并且需要比写入更频繁地阅读列表,请考虑pthread_rwlock()接口。

更新:您还可以在平台上查看sizeof(pthread_t)吗?如果为8(无符号长整数),则至少应使用%lu格式in printf。