开发者

VC++ threads deadlocked

开发者 https://www.devze.com 2023-02-12 17:09 出处:网络
The following program goes into a deadlock. Can anyone please开发者_运维问答 tell me why? #include<cstdlib>

The following program goes into a deadlock. Can anyone please开发者_运维问答 tell me why?

#include<cstdlib>
#include<windows.h>
#include<iostream>
using namespace std;

class CircularQueue
{
public:
    CircularQueue(int s)
    {
        size = s;
        array = (int*)malloc(sizeof(int) * size);
        head = tail = -1;
        InitializeCriticalSection(&critical_section);
    }

    CircularQueue(void)
    {
        size = default_size;
        array = (int*)malloc(sizeof(int) * size);
        head = tail = -1;
        InitializeCriticalSection(&critical_section);
    }

    void initialize(int s)
    {
        EnterCriticalSection(&critical_section);

        size = s;
        array = (int*)realloc(array, sizeof(int) * size);
        head = tail = -1;

        LeaveCriticalSection(&critical_section);
    }

    void enqueue(int n)
    {
        EnterCriticalSection(&critical_section);

        tail = (tail + 1) % size;
        array[tail] = n;

        LeaveCriticalSection(&critical_section);
    }

    int dequeue(void)
    {
        EnterCriticalSection(&critical_section);

        head = (head + 1) % size;
        return array[head];

        LeaveCriticalSection(&critical_section);
    }

private:
    int *array;
    int size;
    int head, tail;
    CRITICAL_SECTION critical_section;
    bool initialized;
    static const int default_size = 10;
};

DWORD WINAPI thread1(LPVOID param)
{
    CircularQueue* cqueue = (CircularQueue*)param;
    cqueue->enqueue(2);
    cout << cqueue->dequeue() << endl;

    return 0;
}

DWORD WINAPI thread2(LPVOID param)
{
    CircularQueue* cqueue = (CircularQueue*)param;
    cqueue->enqueue(3);
    cout << cqueue->dequeue() << endl;

    return 0;
}

int main(void)
{
    HANDLE thread1_handle;
    HANDLE thread2_handle;

    CircularQueue cqueue;
    HANDLE array[2];

    thread1_handle = CreateThread(NULL, 0, thread1, &cqueue, 0, NULL);

    thread2_handle = CreateThread(NULL, 0, thread2, &cqueue, 0, NULL);

    array[0] = thread1_handle;
    array[1] = thread2_handle;

    WaitForMultipleObjects(1, array, TRUE, INFINITE);

    CloseHandle(thread1_handle);
    CloseHandle(thread2_handle);

    printf("end\n");
    return 0;
}


In dequeue(), you have a return statement before the LeaveCriticalSection() call. If you had compiler warnings turned up higher, it would probably have told you about this!

0

精彩评论

暂无评论...
验证码 换一张
取 消