我有簡單的C++代碼,它首先創建4個線程,然後將1000次數字1發送到C++隊列,然後是4個0.每個線程試圖從該隊列讀取,並且當任何線程讀取0時,它終止並打印其局部總和。如果它讀取1,那麼它只會將總和加1。讀數用互斥鎖保護。代碼按照預期在5次中的4次中有效,但有時會得到double free or corruption (!prev) error... ...Abort core dumped
。我也使用gdb調試了代碼,但只得到了received signal SIGABRT, Aborted ... ...at raise.c: No such file or directory".
我沒有明確分配或釋放任何內存。什麼可能導致這個問題?使用線程和互斥鎖時出現雙重空閒或損壞(!prev)錯誤
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
std::queue<int> my_queue;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *process(void *arg){
int sum = 0;
while(1){
if(!my_queue.empty()){
pthread_mutex_lock(&mutex);
if (my_queue.front() == 1){
sum += 1;
my_queue.pop();
pthread_mutex_unlock(&mutex);
}
else{
my_queue.pop();
printf("Sum: %d\n", sum);
pthread_mutex_unlock(&mutex);
break;
}
}
}
return arg;
}
int main(void){
pthread_t id[4];
for(int i = 0; i < 4; i++){
if (pthread_create(&id[i], NULL, process, NULL) != 0){
fprintf(stderr, "%s\n", "Error creating thread!");
exit(EXIT_FAILURE);
}
}
for (int i = 0; i < 1000; i++){
my_queue.push(1);
}
for (int i = 0; i < 4; i++){
my_queue.push(0);
}
for (int i = 0; i < 4; i++){
pthread_join(id[i], NULL);
}
return EXIT_SUCCESS;
}
'if(!my_queue.empty()){' - 不在鎖內,TOCTTOU錯誤。 – ThingyWotsit
那麼你在沒有保護的情況下會大量推入'my_queue'。 –
通常使用至少一個信號量來計數隊列中的條目,從而防止在空隊列上循環。 – ThingyWotsit