我写了一个线程应用程序的基本例子,它似乎没有像我期望的那样工作。程序应该打印从0到99的数字,但似乎在跳过。我已经追踪到这样一个事实,即在thread_join()
循环第一次执行后,下一次,info[k].tid
是零。我不知道为什么会发生这种情况。
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct {
pthread_t tid;
int i;
int res;
} thread_info;
void *square(void *data) {
thread_info *info = (thread_info*) data;
info->res = info->i;
return NULL;
}
int main(void) {
int nthread = 2;
int lim = 100;
int *results;
results = calloc(lim, sizeof(int ));
thread_info *info = calloc(nthread, sizeof(thread_info));
for (int i=0; i<lim; i++) {
info[i % nthread].i = i;
pthread_create(&info[i].tid, NULL, square, info + (i%nthread));
if (((i+1) % nthread)) {
continue;
}
for (int k=0; k<nthread; k++) {
pthread_join(info[k].tid, NULL);
}
for (int k=0; k<nthread; k++) {
results[info[k].i] = info[k].res;
}
memset(info, 0, sizeof(thread_info) * nthread);
}
for (int i=0; i<100; i++) {
printf("%d\n", results[i]);
}
return 0;
}
1条答案
按热度按时间xeufq47z1#
编写的代码已损坏:这里
您正在访问
info[i].tid
(i
在[0, 100)
范围内,但info
只包含2(nthread
)个元素。这是缓冲区溢出。此处:
您正在加入
info[0].tid
和info[1].tid
。这对i == 0
和i == 1
有效,但由于上述错误,对i == 3
无效。您希望:
你也应该 * 总是 * 检查所有
pthread_*
函数的返回值。这样做会节省很多调试时间。例如,通过此更改,问题变得更加清楚: