我正在尝试使用
我无法找出以上代码的问题所在。错误每次都不同,有些只是
shared_ptr
在C++中实现延迟并发基于列表的集合。我的理解是,只有最后一个引用节点的shared_ptr
才会自动释放不可达节点
。根据我的理解,对shared_ptr
的引用计数进行的增减操作是原子的。这意味着仅具有对该节点的最后一个shared_ptr
应调用delete/free
。我已经为多个线程运行了程序,但是程序崩溃并显示错误double free called
或Segmentation Fault(SIGSEGV)。我不明白这是怎么可能的。下面是我的实现代码,其中方法名表示其预期操作。#include<thread>
#include<iostream>
#include<mutex>
#include<climits>
using namespace std;
class Thread
{
public:
std::thread t;
};
int n=50,ki=100,kd=100,kc=100;`/*no of threads, no of inserts,deletes & searches*/`
class Node
{
public:
int key;
shared_ptr<Node> next;
bool marked;
std::mutex nodeLock;
Node() {
key=0;
next = nullptr;
marked = false;
}
Node(int k) {
key = k;
next = nullptr;
marked = false;
}
void lock() {
nodeLock.lock();
}
void unlock() {
nodeLock.unlock();
}
~Node()
{
}
};
class List {
shared_ptr<Node> head;
shared_ptr<Node> tail;
public:
bool validate(shared_ptr<Node> pred, shared_ptr<Node> curr) {
return !(pred->marked) && !(curr->marked) && ((pred->next) == curr);
}
List() {
head=make_shared<Node>(INT_MIN);
tail=make_shared<Node>(INT_MAX);
head->next=tail;
}
bool add(int key)
{
while(true)
{
/*shared_ptr<Node> pred = head;
shared_ptr<Node> curr = pred->next;*/
auto pred = head;
auto curr = pred->next;
while (key>(curr->key))
{
pred = curr;
curr = curr->next;
}
pred->lock();
curr->lock();
if (validate(pred,curr))
{
if (curr->key == key)
{
curr->unlock();
pred->unlock();
return false;
}
else
{
shared_ptr<Node> newNode(new Node(key));
//auto newNode = make_shared<Node>(key);
//shared_ptr<Node> newNode = make_shared<Node>(key);
newNode->next = curr;
pred->next = newNode;
curr->unlock();
pred->unlock();
return true;
}
}
curr->unlock();
pred->unlock();
}
}
bool remove(int key)
{
while(true)
{
/*shared_ptr<Node> pred = head;
shared_ptr<Node> curr = pred->next;*/
auto pred = head;
auto curr = pred->next;
while (key>(curr->key))
{
pred = curr;
curr = curr->next;
}
pred->lock();
curr->lock();
if (validate(pred,curr))
{
if (curr->key != key)
{
curr->unlock();
pred->unlock();
return false;
}
else
{
curr->marked = true;
pred->next = curr->next;
curr->unlock();
pred->unlock();
return true;
}
}
curr->unlock();
pred->unlock();
}
}
bool contains(int key) {
//shared_ptr<Node> curr = head->next;
auto curr = head->next;
while (key>(curr->key)) {
curr = curr->next;
}
return curr->key == key && !curr->marked;
}
}list;
void test(int curr)
{
bool test;
int time;
int val, choice;
int total,k=0;
total=ki+kd+kc;
int i=0,d=0,c=0;
while(k<total)
{
choice = (rand()%3)+1;
if(choice==1)
{
if(i<ki)
{
val = (rand()%99)+1;
test = list.add(val);
i++;
k++;
}
}
else if(choice==2)
{
if(d<kd)
{
val = (rand()%99)+1;
test = list.remove(val);
d++;
k++;
}
}
else if(choice==3)
{
if(c<kc)
{
val = (rand()%99)+1;
test = list.contains(val);
c++;
k++;
}
}
}
}
int main()
{
int i;
vector<Thread>thr(n);
for(i=0;i<n;i++)
{
thr[i].t = thread(test,i+1);
}
for(i=0;i<n;i++)
{
thr[i].t.join();
}
return 0;
}
我无法找出以上代码的问题所在。错误每次都不同,有些只是
SEGFAULTS
。pure virtual method called
terminate called without an active exception
Aborted (core dumped)
请指出我在上面的代码中做错了什么?如何解决这个错误?
编辑:添加了一个非常简单的test function
,随机调用三个list methods
。同时,线程数和每个操作的数量是全局声明的。虽然编程粗糙,但它会导致SEGFAULT。
shared_ptr
,很好。我敬佩实验精神。 - user4581301main
的完整代码吗?还是只在评论中发布它? - Dee Jaymain
函数。无需发起另一个问题。同时,请勿在评论中发布代码。 - PaulMcKenziepred&curr
,就会调用“validate”函数来检测任何同步冲突。validate
检查pred&curr
是否未被标记,并且pred仍指向curr。即使删除了pred
或curr
,它们也会首先被标记(remove方法)。因此,“Lazy Synchronization”是该列表的名称。 - Dee Jay