Khi tôi chạy đoạn mã sau, bản in có vẻ không chính xác.
void thread_Calc(int *pos) {
printf("đã nhận %d\n", *pos);
sig = -1;
mandel_Calc(&slices[*pos],maxIterations,&res[(*pos)*slices[*pos].imSteps*slices[*pos].reSteps]);
bộ đếm++;
mảng[bộ đếm] = *pos;
sig = *pos;
}
int main(int argc, char *argv[]) {
while (WinH % nofslices != 0) { nofslices++;}
slice_height = WinH/nofslices;
cấp độ = 1;
trong khi (1) {
for (i=0; i
mảng[i] = -1;
}
y=0;
sig = -1;
bộ đếm = -1;
for(i=0; i
printf("Đang truyền %d\n", i);
check=pthread_create(&worker[i], NULL, (void*)thread_Calc, (void*)(int *)&i);
nếu (kiểm tra!=0) {
printf("Lỗi trong pthread_create\n");
return 0;
}
trong khi (sig==-1||mảng[bộ đếm]==-1){
}
}
}
}
(Đây chỉ là một phần mã của tôi, vì vậy giả sử mỗi biến đều đúng và có giá trị).
我得到的结果是这样的:
Vượt qua 1
Vượt qua 2
nhận được 2
nhận được 2
Vượt qua 3
Vượt qua 4
nhận được 4
nhận được 4
Vượt qua 5
Vượt qua 6
Vượt qua 7
Vượt qua 8
Đạt 9
Có vẻ như không phải lúc nào tôi cũng có thể chuyển các tham số chính xác trong pthread_create hoặc thứ gì đó.
@Andrew nói đúng. Bạn đang truyền một con trỏ chứ không phải một giá trị, vì vậy ngay khi bạn thay đổi "i" trong luồng chính, giá trị trong tham số mà luồng tạo nhận được sẽ thay đổi. Bạn cần tạo một bản sao và chuyển nó vào chuỗi.
Nhìn thấy pthread_create: truyền một số nguyên làm đối số cuối cùng
Tôi là một lập trình viên xuất sắc, rất giỏi!