线程内通信(Windows 下) 有名管道

这个样例主要是利用管道实现进程同步

 

 

使用的API 

函数名功能说明参数说明
CreateSemaphore()创建一个信号量LPSECURITY_ATTRIBUTES lpSemaphoreAttributes

信号量的属性,

一般可以设置为NULL

 
LONG lInitialCount

信号量初始值,必须大于等于0,而且小于等于 lpMaximumCount,如果lInitialCount 的初始值为0,

则该信号量默认为unsignal状态,如果lInitialCount的初始值大于0,则该信号量默认为signal状态,

LONG lInitialCount

设置信号量的最大值,

必须大于0

  LPCTSTR lpName 

信号量的名字,长度不能超出MAX_PATH ,

可设置为NULL,表示无名的信号量。

当lpName不为空时,可创建有名的信号量,

若当前信号量名与已存在的信号量的名字相同时,则该函数表示打开该信号量,这时参数lInitialCount 和
lMaximumCount 将被忽略。

 
 
ReleaseSemaphore()释放信号量HANDLE  hSemaphore信号量句柄
LONG  lReleaseCount

释放的数量,

一般完成一个等待后调用此函数释放一个信号量,使得信号量平衡。

LPLONG lpPreviousCount

存放以前信号量的数量 ,

一般可为NULL.

  
   
OpenSemaphore()打开一个有名的信号量DWORD  dwDesiredAccess

对信号量的访问权限,
取值可以是SEMAPHORE_ALL_ACCESS,可对信号量执行尽可能多的操作;

可以是SEMAPHORE_MODIFY_STATE,允许使用ReleaseSemaphore释放信号量,

达到修改信号量;

还可以是SYNCHRONIZE,用等待函数异步的等待信号量变为signal状态

BOOL bInheritHandle如果为true,信号量句柄可被继承,反之不可继承。
  LPCTSTR lpName 信号量的名字
  
   
CloseHandle()关闭一个信号HANDLE   hSemaphore信号量的名字
  
  
  

 

实例代码: 

#include <stdio.h>
#include <windows.h>
/*


*/
DWORD WINAPI Thread_1(LPVOID param);
DWORD WINAPI Thread_2(LPVOID param);
DWORD WINAPI Thread_3(LPVOID param);

HANDLE  hSM_1;
HANDLE  hSM_2;
HANDLE  hSM_3;

HANDLE hThread_1;
HANDLE hThread_2;
HANDLE hThread_3;


int main(void)
{
    hSM_1 = CreateSemaphore(NULL, 1, 1, "A");//创建一个管道 
    hSM_2 = CreateSemaphore(NULL, 0, 1, "B");
    hSM_3 = CreateSemaphore(NULL, 0, 1, "C");

    hThread_1 = CreateThread(NULL, 0, Thread_1, NULL, 0, NULL);//创建一个线程 
    hThread_2 = CreateThread(NULL, 0, Thread_3, NULL, 0, NULL);
    hThread_3 = CreateThread(NULL, 0, Thread_2, NULL, 0, NULL);

    //等待三个线程都执行完
    WaitForSingleObject(hThread_1, INFINITE);
    WaitForSingleObject(hThread_2, INFINITE);
    WaitForSingleObject(hThread_3, INFINITE);
    //三个线程都执行完
    printf("\n\n\t main end \n");
    //关闭句柄
    CloseHandle(hThread_1);//没有关闭就会一直留在系统中 
    CloseHandle(hThread_2);
    CloseHandle(hThread_3);

    CloseHandle(hSM_1);
    CloseHandle(hSM_2);
    CloseHandle(hSM_3);
    return 0;
}
DWORD WINAPI Thread_1(LPVOID param)
{
    for (int i = 0; i < 10; i ++)
    {
        DWORD dwWait = WaitForSingleObject(hSM_1, INFINITE);	//挂起线程 

        //每一个wait过后信号量的数量自动减1,这样就达到了控制同步

        printf("A");
        ReleaseSemaphore(hSM_2, 1, NULL);
    }
    return 0;
}

DWORD WINAPI Thread_2(LPVOID param)
{
    for (int i = 0; i < 10; i ++)
    {
        WaitForSingleObject(hSM_2, INFINITE);
        printf("B");
        ReleaseSemaphore(hSM_3, 1, NULL);
    }
    return 0;
}

DWORD WINAPI Thread_3(LPVOID param)
{
    for (int i = 0; i < 10; i ++)
    {
        WaitForSingleObject(hSM_3, INFINITE);
        printf("C ");
        ReleaseSemaphore(hSM_1, 1, NULL);
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
进程和线程是操作系统中的基本概念,它们是并发编程的重要组成部分。 进程是资源分配的最小单位,它是操作系统中运行的程序的一个实例。每个进程都有自己的地址空间、堆栈、数据区等资源,进程之间彼此独立,互不干扰。进程的创建、终止、等待等操作都是由操作系统负责管理的。 线程是进程中的一个执行单元,它是操作系统中最小的调度单位。线程共享进程的地址空间、堆栈、数据区等资源,不同的线程之间可以互相通信和协作。线程的创建、终止、等待等操作都是由操作系统负责管理的。 进程和线程的创建都需要调用操作系统提供的系统调用。在Linux系统中,进程的创建可以通过fork和exec函数来实现,线程的创建可以通过pthread_create函数来实现。进程和线程的终止可以通过exit函数来实现,也可以由操作系统强制终止。 进程和线程之间的通信可以通过管道、有名管道等方式来实现。管道是一种半双工的通信方式,它只能在父进程和子进程之间进行通信有名管道是一种全双工的通信方式,它可以在多个进程之间进行通信。在Linux系统中,管道的创建可以通过pipe函数来实现,有名管道的创建可以通过mkfifo函数来实现。 管道和有名管道的读写操作都是通过文件描述符来实现的。读操作可以通过read函数来实现,写操作可以通过write函数来实现。在使用管道和有名管道进行通信时,需要注意避免死锁和竞争条件等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值