#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이 발생하네요...

이유를 도저히 못찾겠어서 질문 드립니다..