⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 读写.txt

📁 通过课程设计
💻 TXT
字号:
#include <stdlib.h>

#include <windows.h>

 

#include "Reader-Writer.h"

#include "Semaphore.h"

 

// 这是 Windows 下多线程工作的 P 操作

#define P(S) WaitForSingleObject(S, INFINITE)

 

// 这是 Windows 下多线程工作的 V 操作

#define V(S) ReleaseSemaphore(S, 1, NULL)

 

const int RN = 5; // 所有读者总数

const int WN = 3; // 所有写者总数

 

HANDLE Sdoc; // 文档信号量——互斥量

HANDLE Sr;   // 读者信号量——广义信号量

 

HANDLE Scnt; // 保护 g_cntReader 的互斥量

int g_cntReader = 0; // 读者个数计数器

 

// ##############+. Descripted By Tang Houjian [2003-9-26 20:10:49] .+##########

// |  funcname  :  JustWait ( ) 

// +  note      :  显示一些信息,让后等待

// |               

// +-----------------------------------------------------------------+

// |  ret val   :  void 

// |               

// +  Parameter :  
style="FONT-FAMILY: 'Courier New'">

// |         [    int ] - nReader 读者(写者)编号,读者>0,写者<0

// |         [    int ] - min     操作等待的最短时间

// |         [    int ] - max     操作等待得最长时间,实际等待的时间介于两者之间

// |         [ LPCSTR ] - info    要显示的信息

void JustWait(int nReader, int min, int max, LPCSTR info)

// +-----------------------------------------------------------------+

{

    // 等待时间的基本量,以毫秒表示

    const int BASETIME = 1000;

 

    // 实际等待得时间

    int wait_time = 0;

    if (max==min)  // 判断是为了避免 %0错误,注意取随机值

        wait_time = min*BASETIME;

    else

        wait_time = rand()%(max*BASETIME-min*BASETIME) + min*BASETIME;

 

    // 最终显示的信息缓冲

    char s_out[128];

 

    // 读者大于0,写者小于0

    if (nReader > 0)

        sprintf(s_out, "Reader [%d]: %s\n", nReader, info);

    else

        sprintf(s_out, "\tWriter [%d]: %s\n", -nReader, info);

 

    // 打印

    printf(s_out);

 

    // 然后等待

    Sleep(wait_time);

}

 

// 这是主函数

void TryReaderAndWriter()

{

    // 创建信号量      这是初值--+  +----这是最大信号量值

    //                           |  |

    Sdoc = CreateSemaphore(NULL, 1, 1, "Document");

 

    // 一次最多允许 3 个读者读

    Sr = CreateSemaphore(NULL, 3, 3, "ReaderNumber");

 

    // 他也是一个互斥信号量,初值为 1

    Scnt = CreateSemaphore(NULL, 1, 1, "ReaderCounterProtect");

 

    // 线程句柄

    HANDLE threads[RN+WN];

 

    // 创建读者线程,共有 RN 个读者

    for (int i=0; i<RN; i++)

        threads[i] = CreateThread(0, 0, Reader, 0, 0, 0);

 

    // 创建写者线程,共有 WN 个写者

    for (int j=0; j<WN; j++)

        threads[j+RN] = CreateThread(0, 0, Writer, 0, 0, 0);

 

    WaitForMultipleObjects(RN+WN, threads, TRUE, INFINITE);

}

s

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -