我正在尝试声明一个数据类型为 int 的变量指针,以存储线程 ID (即 myid),然后将其设置为等于显式类型转换为参数 vargp 的整数指针。但是,当我尝试输出 ID 号时,我得到的是一个地址,而不是实际值。for 循环应该为 LOOP 迭代运行。以下是我到目前为止对上一个声明的内容。int *myid = (int *)vargp;
这是函数的其余部分。
void* threadFunction(void *vargp) {
int LOOP = 0;
unsigned long i = 0;
int *myid = (int*) vargp;
printf("n-----------------------------n");
printf("nThread %d has startedn", *myid);
printf("n-----------------------------n");
while (LOOP <= 5) {
printf("nThread ID %d is printing iteration %d", *myid, LOOP);
LOOP++;
}
printf("nThread %d has finishedn", *myid);
return NULL;
}
我得到应该Thread ID -136702208 is printing iteration 0
Thread ID 1 is printing iteration 0
我该如何解决这个问题?
下面是调用线程函数的函数。
void multiThreads() {
int SIZE = 5;
int i = 0;
int error;
pthread_t tid[SIZE];
for (i = 0; i < SIZE; i++) {
error = pthread_create(&(tid[i]), NULL, threadFunction, (void*) &(tid[i]));
if (error != 0) {
printf("nThread can't be created : [%s]", strerror(error));
}
} //end for
while (i < SIZE) {
pthread_join(tid[i], NULL);
i++;
}
}
由于pthread_t
的内容未定义,我tid
更改为包含所需pthread_t t
和数字id
值的struct
。 初始化 id 并将id
的地址作为 arg 传入。 将 SIZE 更改为大小,因为大写通常适用于您定义的值。 使用main()
而不是multiThreads()
来驱动未更改的threadFunction()
:
int main() {
int size = 5;
struct {
pthread_t t;
int id;
} threads[size];
for(unsigned i=0; i < size; i++){
threads[i].id = i + 1;
int error = pthread_create(&threads[i].t, NULL, threadFunction, &threads[i].id);
if(error) {
printf("nThread can't be created : [%s]", strerror(error));
}
}
for(unsigned i = 0; i < size; i++) {
pthread_join(threads[i].t, NULL);
}
return 0;
}
这里是输出的片段:
-----------------------------
Thread 1 has started
-----------------------------
Thread ID 1 is printing iteration 0
Thread ID 1 is printing iteration 1
Thread ID 1 is printing iteration 2
Thread ID 1 is printing iteration 3
Thread ID 1 is printing iteration 4
Thread ID 1 is printing iteration 5
Thread 1 has finished
-----------------------------
Thread 5 has started
-----------------------------
Thread ID 5 is printing iteration 0
Thread ID 5 is printing iteration 1
Thread ID 5 is printing iteration 2
Thread ID 5 is printing iteration 3
Thread ID 5 is printing iteration 4
Thread ID 5 is printing iteration 5
Thread 5 has finished
-----------------------------
Thread 3 has started
-----------------------------
Thread 4 has started
-----------------------------
Thread ID 4 is printing iteration 0
Thread ID 4 is printing iteration 1
Thread ID 4 is printing iteration 2
Thread ID 4 is printing iteration 3