#include
#include
class Node
{
public:
int data;
Node* next;
Node()
{
data = 0;
next = NULL;
}
Node(int i)
{
data = i;
next = NULL;
}
};
class List
{
public:
List()
{
headptr = 0L;
}
long long headptr;
long long count = 1;
long long getCount(long long* ptr)
{
long long temp = *ptr;
temp >> 52;
*ptr = temp;
return *ptr;
}
long long getAddress(long long* ptr)
{
long long temp = *ptr;
temp = (temp <> 12;
*ptr = temp;
//_InterlockedCompareExchange64((volatile long long*)ptr, temp, *ptr);
return *ptr;
}
long long build(Node* node, int counter)
{
long long ptr = (long long)node;
long long cnt = (long long)counter <
ptr = (ptr | cnt);
return ptr;
}
void push(Node* newnode)
{
while (true)
{
long long tmph = headptr;
long long tmp = (tmph<> 12; //untag
newnode->next = (Node*)tmp;
long long cnt = (count++) <
long long tagnew = (long long)newnode | cnt;
newnode = (Node*)tagnew;
if (_InterlockedCompareExchange64((volatile long long*)&headptr, tagnew, tmph) == tmph)
{
break;
}
}
}
Node* pop()
{
while (true)
{
long long headp = headptr;
long long untagheadp = (headp <> 12; //untag;
Node* headnode = (Node*)untagheadp;
long long nextp = (long long)headnode->next;
//long long untagnextp = (nextp <> 12; //untag;
if (headp == NULL)
return NULL;
long long cnt = (long long)(count++) <
nextp = nextp | cnt;
if (_InterlockedCompareExchange64((volatile long long*)&headptr, nextp, headp))
{
return headnode;
}
}
}
void print()
{
long long head = getAddress(&headptr);
Node* tmp = (Node*)head;
if (tmp == NULL)
std::cout << "list is empty" <
while (tmp != NULL)
{
std::cout <data << " ";
long long next = (long long)tmp->next;
getAddress(&next);
tmp = (Node*) next;
}
std::cout <
}
void showcount()
{
int count2 = 0;
long long head = getAddress(&headptr);
Node* tmp = (Node*) head;
if (tmp == NULL)
std::cout << "list is empty" <
while (tmp != NULL)
{
count2++;
long long next = (long long)tmp->next;
getAddress(&next);
tmp = (Node*)next;
}
std::cout <
}
};
static List* freelist = new List();
static List* headlist = new List();
void threadbody()
{
int count = 0;
while (count
{
for (int i = 0; i
{
if (freelist->headptr != NULL)
{
Node* temp = freelist->pop();
headlist->push(temp);
}
}
for (int j = 0; j
{
if (headlist->headptr != NULL)
{
Node* temp = headlist->pop();
freelist->push(temp);
}
}
count++;
}
std::cout << "Thread End" <
}
int main()
{
for (int i = 0; i
{
freelist->push(new Node(i));
}
freelist->showcount();
std::thread t1(&threadbody);
int count = 0;
while (count
{
for (int i = 0; i
{
if (freelist->headptr != NULL)
{
Node* temp = freelist->pop();
headlist->push(temp);
}
}
for (int j = 0; j
{
if (headlist->headptr != NULL)
{
Node* temp = headlist->pop();
freelist->push(temp);
}
}
count++;
}
std::cout << "Main End" <
t1.join();
freelist->showcount();
headlist->showcount();
}
메인 스레드 하나만 실행 할 경우에는 아무런 문제 없이 작동이 됩니다.
근데 스레드 2개로 실행을 하면 read access violation이 발생하네요...
이유를 도저히 못찾겠어서 질문 드립니다..
https://nanikit.github.io/dc-highlighter/
여기서 다시 복사해라