记点笔记——c语言多线程

#include <stdio.h>
#include <Windows.h>
#include <process.h>
#include<stdbool.h>

void Input(void*);
void Output(void*);

/*定义输出机数量与需要输出的PC机数量*/
#define Writer_COUNT 8//  PC机数量(写者)——向输出井输出数据
#define Reader_COUNT 3//输出机数量(读者)——从输出井取出数据输出
/* 信号量句柄 */
HANDLE write;//进程优先互斥
HANDLE mutex;//临界资源互斥
HANDLE RCsignal;//读者数Rcount修改互斥
HANDLE WCsignal;//写者数Wcount修改互斥
/* 读写进程的数量 */
int reader_count = 0;
int writer_count = 0;

/* 主线程 */
int main()
{
    bool flag = true;
    /*开辟共享内存空间*/

    /* 创建信号量 */
    write = CreateSemaphore(NULL, 1, 1, NULL);
    mutex = CreateSemaphore(NULL, 1, 1, NULL);
    RCsignal = CreateSemaphore(NULL, 1, 1, NULL);
    WCsignal = CreateSemaphore(NULL, 1, 1, NULL);

    HANDLE hThreads[Writer_COUNT + Reader_COUNT]; //各线程的 handle
    DWORD writerID[Writer_COUNT]; //写者线程的标识符
    DWORD readerID[Reader_COUNT]; //读者线程的标识符
    /* 创建线程 */
    srand(time(0));

    for (int i = 0; i < Writer_COUNT + Reader_COUNT; i++)
    {
        int ran = rand() % 10;
        if ((ran < 5) && (writer_count < Writer_COUNT))//Writer
        {
            hThreads[i] = (HANDLE)_beginthread(Input, 0, NULL);
            if (hThreads[i] == NULL) return -1;
        }
        else if ((ran >= 5) && (reader_count < Reader_COUNT))//Reader
        {
            hThreads[i] = (HANDLE)_beginthread(Output, 0, NULL);
            if (hThreads[i] == NULL) return -1;
        }
        printf("运行了%d个writer线程, %d个reader线程======\n", writer_count, reader_count);
        Sleep(500);//等待500ms
    }
    //while (flag == true)
    //{
    //    if (getchar())  //按回车后终止程序运行
    //    {
    //        flag = false;
    //    }
    //}
    //WaitForSingleObject(, INFINITE);
    Sleep(5000);
    CloseHandle(write);
    CloseHandle(mutex);
    CloseHandle(RCsignal);
    CloseHandle(WCsignal);
    printf("主线程结束");
    return 0;
}


/* PC机线程,向输出井中写入数据——写者 */
void Input(void* arg)
{
        WaitForSingleObject(WCsignal, INFINITE);
        if (writer_count == 0) {
            WaitForSingleObject(write, INFINITE);
        }
        writer_count++;
        ReleaseSemaphore(WCsignal, 1, NULL);
        WaitForSingleObject(mutex, INFINITE);
        printf("%d号PC机正在写入数据\n", GetCurrentThreadId());
        Sleep(3000);
        ReleaseSemaphore(mutex, 1, NULL);
        WaitForSingleObject(WCsignal, INFINITE);
        writer_count--;
        if (writer_count == 0) {
            ReleaseSemaphore(write, 1, NULL);
        }
        ReleaseSemaphore(WCsignal, 1, NULL);
        return;
}


/* 输出机线程,从输出井取出数据并展示在屏幕——读者 */
void Output(void* arg)
{
        WaitForSingleObject(write, INFINITE);//防止其他进程在写
        WaitForSingleObject(RCsignal, INFINITE);//互斥修改reader_count
        if (reader_count == 0) {
            WaitForSingleObject(mutex, INFINITE);//当目前没有读进程,需要设置读与写互斥访问
        }
        reader_count++;
        ReleaseSemaphore(RCsignal, 1, NULL);
        ReleaseSemaphore(write,  1, NULL);
        //此处进行相关的读取操作
        printf("%d 号进程正在进行读操作...\n", GetCurrentThreadId());
        Sleep(3000);
        WaitForSingleObject(RCsignal, INFINITE);
        reader_count--;
        if (reader_count == 0) {
            ReleaseSemaphore(mutex, 1, NULL);
        }
        ReleaseSemaphore(RCsignal, 1, NULL);
        return;
}

本来做spooling技术——OS课设,卡了很久很久,一直想着要去调用API去创建进程实现spooling但是说实话对于底层的API都不熟悉,确实写的很难受,现在推翻重来了,上面的代码算是记笔记了。

猜你喜欢

转载自blog.csdn.net/m0_60388871/article/details/128758019