2

所以,我很难在结构列表中找到当前线程 id,它反映了有关线程的信息。

基本上,列表中的每个元素都有一个 field 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 说它们不是。

我错过了什么?

4

1 回答 1

2

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

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

更新:您也可以检查sizeof(pthread_t)一下您的平台吗?如果是 8(无符号长),你至少应该使用 %lu 格式inprintf。

于 2013-05-19T19:32:38.557 回答