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;
}
Как решить эту проблему и добиться успешного прохождения теста?