我有简单的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