Random CAS behavior

48 views
Skip to first unread message

ka3a4ok

unread,
Sep 22, 2011, 5:29:55 AM9/22/11
to Relacy Race Detector
Этот тест приводит к AV.

struct FailTest:
rl::test_suite<FailTest, 1>
{
std::atomic<int*> m;

void before()
{
m($)=0;
}

void thread(unsigned thread_index)
{
for(int t=0; t<100; t++)
{
int* n(NULL);

if
( !m($).compare_exchange_weak
( n,
NULL
)
)
{
(*n)++; //AV here
}
}
}

void after()
{

}

void invariant()
{

}
};//struct FailTest

Этот абстрактный тест отражает более конкретную проблему, которая
возникла у меня в коде. Есть односвязанный LF список. Стартуя с
некоторого у зла, мы доходим до конца списка (Node->next==NULL) и
создаем новый узел, который пытаемся вставить в конец либо вернуть уже
вставленный, если какой-то поток успел перехватить управелние и
вставил свой узел раньше нашего(далее скорее псевдокод, чем код):

Node* new_node=new Node(...);
Node* cmp=NULL;

if(tail->next($).compare_exchange_weak(cmp, new_node))
{
//Удалось вставить наш узел
return new_node;
}
else
{
//Кто-то уже вставил
new_node->some_field==1 // тут случайным образом вознкинет AV при
прогоне в тесте RRD, т.е. new_node будет NULL
delete new_node;
return cmp;
}

Как решить эту проблему и добиться успешного прохождения теста?

Dmitriy Vyukov

unread,
Sep 22, 2011, 3:55:55 PM9/22/11
to Relacy Race Detector
May I see the whole test?
Reply all
Reply to author
Forward
0 new messages