2

そのため、スレッドに関する情報を反映する構造のリストで現在のスレッド 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 つしかないため、次の 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++;

問題は、要素がリストにあるにもかかわらず、それが見つからないことです。比較ごとに 1 行出力しました (たとえば419817216 419817216 0、リスト内の tid、キー tid、および pthread_equal の結果を表示)。ご覧のとおり、数値表現は同じですが、どういうわけか pthread_equal はそうではないと言っています。

私は何が欠けていますか?

4

1 に答える 1

2

my_threads異なるスレッドから要素を追加/削除/チェックすると、すべてがワイルドになる可能性があります。コードのフラグメントから、この構造に対するミューテックス保護がないと思われます。

実際にロックを実装しておらず、書き込みよりも頻繁にリストを読み取る必要がある場合は、pthread_rwlock()インターフェースについて検討してください。

更新: またsizeof(pthread_t)、プラットフォームを確認していただけますか? 8 (unsigned long) の場合、少なくとも %lu 形式のinprintf を使用する必要があります。

于 2013-05-19T19:32:38.557 に答える