如何让线程永远记住它在 C pthread 中的哪个数字,直到被销毁?

How to let a thread remember which number it is in C pthread forever until destroyed?

提问人:Kagura Hitoha 提问时间:11/11/2023 更新时间:11/11/2023 访问量:54

问:

我必须创建多个线程并多次使用它们。我需要让每个线程记住它是第 i 个线程(而不是系统线程 ID)。因此,线程函数中需要有一个静态位置。但是,静态变量只能使用常量值启动。另一方面,由于线程被多次使用,它们的 void *arg 会随着时间的推移而变化。因此,自创造以来,他们必须永远保持他们的数字。如何做到这一点?

我尝试首先将所有线程号存储在全局数组中。但是,让每个线程记住其对应的数组索引仍然面临同样的问题。

sem_t begin_sem, finish_sem;
int thr_nums[100];
int num;
void **thr_args;
pthread_t *threads;
void *thr_func(void *arg);

struct rusage main_usage;        // get usage for main thread


int create_mat_vec_mul(int thr_count)
{
    int i;
    num = thr_count;
    thr_args = calloc((size_t) thr_count, sizeof(void *));
    threads = calloc((size_t) thr_count, sizeof(pthread_t));
    sem_init(begin_sem, 0, 1);
    for (i = 0; i < thr_count; ++i) {
        thr_nums[i] = i;
        thr_args[i] = calloc(1, sizeof(void *));
        thr_args[i] = thr_nums + i;
    }
    for (i = 0; i < thr_count; ++i) {
        pthread_create(threads + i, NULL, thr_func, (void *) thr_args[i]);
        pthread_join(threads[i], NULL);
    }
    for (i = 0; i < thr_count; ++i) {
        free(thr_args[i]);
    }
    return 0;
}

void *thr_func(void *arg)
{
    static int *this_num_ptr = arg; // this is erroneous
    sem_wait(&begin_sem);
    
}
C 多线程静态

评论

1赞 Some programmer dude 11/11/2023
为什么需要?this_num_ptrstatic
0赞 Some programmer dude 11/11/2023
但是,您还有其他问题:紧随其后的是您认为分配给的第一个值会发生什么?thr_args[i] = ...thr_args[i] = ...thr_args[i]
0赞 Some programmer dude 11/11/2023
此外,您实际上可以使用正确的强制转换将值传递给线程函数。创建线程时,在线程函数中无需为所有数组和动态分配以及内存泄漏等而烦恼。intpthread_create(..., (void *) (intptr_t) i)int this_num = (int) (intptr_t) arg;
1赞 Some programmer dude 11/11/2023
关于再次...你真的知道局部变量意味着什么吗?这意味着该函数只有一个变量,所有调用都共享该变量。这真的不是你想要的。所以简单的解决方案就是简单地不做,你会解决多个问题。staticstaticstatic
0赞 Kagura Hitoha 11/11/2023
@Someprogrammerdude谢谢。我想做的是初始化一次部分乘法线程,并在将来多次使用它们将矩阵并行乘法为向量。因此,我认为没有机会告诉线程它们的数量。所以我认为他们必须保留一个静态变量来永远记住他们的数字。对于thr_args[i]的多次分配,这确实是一个错误。

答: 暂无答案