使用win32 API创建线程,创建信号量用于线程的同步

创建信号量

语法例如以下

HANDLE semophore;
semophore = CreateSemaphore(lpSemaphoreAttributes, lInitialCount, lMaximumCount, lpName);

CreateSemophore函数的原型例如以下:

HANDLE WINAPI CreateSemaphore(
_In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//属性
_In_ LONG lInitialCount,//初始值
_In_ LONG lMaximumCount,//最大值
_In_opt_ LPCTSTR lpName//信号量对象的名字
);

函数返回一个指向信号量对象的句柄,是一个HANDLE对象

wait操作和signal操作

使用结构通常是这种

while(true){

    WaitForSingleObject(semophore,INFINITE);//wait操作
//临界区
ReleaseSemaphore(semophore,1,NULL);//signal操作
}

两个函数的原型例如以下:

DWORD WaitForSingleObject(
HANDLE hHandle,//句柄。能够指向信号量或者线程
DWORD dwMilliseconds//等待的毫秒数
);
BOOL ReleaseSemaphore(
HANDLE hSemaphore,//句柄,指向信号量
LONG lReleaseCount,//给信号量添加值,通常是1
LPLONG lpPreviousCount//保存信号量之前的值的变量的指针
);

创建线程

HANDLE producer;
//PRODUCER 线程运行这个函数
//pro_id 线程id
producer = CreateThread(NULL, 0, PRODUCER, NULL, 0, &pro_id);//创建线程

函数原型

HANDLE WINAPI CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,//指向线程属性结构体的指针
_In_ SIZE_T dwStackSize,//栈的初始化大小,0表示使用默认的大小
_In_ LPTHREAD_START_ROUTINE lpStartAddress,//起始地址,也就是线程函数的指针
_In_opt_ LPVOID lpParameter,//线程函数參数的指针
_In_ DWORD dwCreationFlags,//控制创建的标志位,0表示线程创建后马上运行,CREATE_SUSPENDED表示新建为suspended状态,直到 ResumeThread 被调用时才运行。STACK_SIZE_PARAM_IS_A_RESERVATION,由dwStackSize 參数指定初始的保留栈的大小。不指定的话,dwStackSize指定提交的大小
_Out_opt_ LPDWORD lpThreadId//线程id的指针
);



生产者消费者线程同步代码例如以下

#include<Windows.h>
#include<iostream> #define QUEUE_LENGTH 10 //缓冲区长度 HANDLE full_sem; //满信号量
HANDLE empty_sem; //空信号量 struct Msg
{
int i;
};//消息结构 Msg MsgQueue[QUEUE_LENGTH]; //缓冲区
int head = 0;//队列头
int tail = 0;//队列尾 DWORD WINAPI CONSUMER(LPVOID lpParameter){//消费者线程
for (int i = 0;;i++){ WaitForSingleObject(full_sem, INFINITE);//wait操作
//WaitForSingleObject(mutex, INFINITE);//多个消费者须要加相互排斥信号量
int val = MsgQueue[head].i;
head = (head + 1) % QUEUE_LENGTH;
//ReleaseSemaphore(mutex, 1, NULL);//signal操作
std::cout << "CONSUMER : "<<val<< std::endl; ReleaseSemaphore(empty_sem, 1, NULL);//signal操作
} return 0;
} DWORD WINAPI PRODUCER(LPVOID lpParameter){//生产者线程
for (int i = 0;; i++){
WaitForSingleObject(empty_sem, INFINITE);
//WaitForSingleObject(mutex, INFINITE);//多个生产者须要加相互排斥信号量
MsgQueue[tail].i = i;
tail=(tail+1) % QUEUE_LENGTH;
//ReleaseSemaphore(mutex, 1, NULL);
std::cout << "PRODUCER : " <<i<< std::endl; ReleaseSemaphore(full_sem, 1, NULL);
} return 0;
} int main(){ full_sem = CreateSemaphore(NULL, 0, QUEUE_LENGTH, NULL);//创建信号量 初始值为0,最大值为QUEUE_LENGTH
empty_sem = CreateSemaphore(NULL,QUEUE_LENGTH,QUEUE_LENGTH,NULL); DWORD pro_id;//pid
DWORD con_id; HANDLE producer = CreateThread(NULL, 0, PRODUCER, NULL, 0, &pro_id);//创建线程
//Sleep(1000);//展示堵塞 HANDLE consumer = CreateThread(NULL, 0, CONSUMER, NULL, 0, &con_id); WaitForSingleObject(producer, INFINITE);
WaitForSingleObject(consumer, INFINITE);//等待线程运行完成 CloseHandle(producer);
CloseHandle(consumer);//关闭内核对象 }

使用Win32 API实现生产者消费者线程同步的更多相关文章

  1. Hadoop生态圈-Kafka的旧API实现生产者-消费者

    Hadoop生态圈-Kafka的旧API实现生产者-消费者 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.旧API实现生产者-消费者 1>.开启kafka集群 [yinz ...

  2. Java基础 线程的通信的三个方法/ 交替数数线程 / 生产者&消费者线程问题

    线程通讯笔记: /** 线程通信 三个方法: * wait(): 调用该方法 是该调用的方法的线程释放共享资源的锁,进入等待状态,直至被唤醒 * notify() : 可以唤醒队列中的第一个等待同一共 ...

  3. [C++] socket - 6 [API互斥事件对象实现线程同步]

    /*API互斥事件对象实现线程同步*/ #include<windows.h> #include<stdio.h> DWORD WINAPI myfun1(LPVOID lpP ...

  4. [C++] socket - 5 [API事件对象实现线程同步]

    /*API事件对象实现线程同步*/ #include<windows.h> #include<stdio.h> DWORD WINAPI myfun1(LPVOID lpPar ...

  5. Hadoop生态圈-Kafka的新API实现生产者-消费者

         Hadoop生态圈-Kafka的新API实现生产者-消费者 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  6. wait和notify实现的生产者消费者线程交互

    public class ProductTest { public static void main(String args[]) { Repertory repertory=new Repertor ...

  7. win32多线程 (二)线程同步之临界区 (critical sections)

    所谓critical sections 意指一小块“用来处理一份被共享之资源”的程序代码.你可能必须在程序的许多地方处理这一块可共享的资源.所有这些程序代码可以被同一个critical  sectio ...

  8. linux 信号量sem实现 生产者—消费者(线程间通信)

    #include<pthread.h> #include<stdlib.h> #include<stdio.h> #include<unistd.h> ...

  9. 经典线程同步问题(生产者&消费者)--Java实现

    生产者-消费者(producer-consumer)问题是一个著名的线程同步问题.它描述的是:有一群生产者线程在生产产品,并将这些产品提供给消费者线程去消费. 为使生产者与消费者之间能够并发执行,在两 ...

随机推荐

  1. ACM_统计字符串

    统计字符串 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定n个字符串,统计字符串的个数. 如给定 5 sss ab sss ...

  2. CSS 样式的优先级(重要,一定要理解)

    1. 同一元素引用了多个样式时,排在后面的样式属性的优先级高 例如,下面的 div,同时引用了 [.default] 和 [.user] 中的样式,其中 [.user] 样式中的 width 属性会替 ...

  3. Android Studio 关于build.gradle配置问题

    当导入一个Android Project时,会出现很多版本的问题,导入前先删除 .idea文件 .gradle文件 ,gradle文件(与.gradle区分,导入时Android Studio会提示重 ...

  4. Ubuntu14.4安装mysql

    一.安装 apt-get install mysql-server mysql-client 设置用户名和密码 二.检查 sudo service mysql restart 三.支持 1.apach ...

  5. php 在Linux下的安装

    1.获取php源码 wget http://cn2.php.net/get/php-5.6.6.tar.gz/from/this/mirror mv mirror php-5.6.6.tar.gz t ...

  6. ubuntu14.0开机guest账号禁用方法

    在终端里进入/usr/share/lightdm/lightdm.conf.d/目录 sudo vim 50-unity-greeter.conf 然后在文件里输入: [SeatDefaults] a ...

  7. PAT_A1114#Family Property

    Source: PAT A1114 Family Property (25 分) Description: This time, you are supposed to help us collect ...

  8. Configuring SSL on Enterprise Manager and the SLB (Release 12.1.0.2 and later)

    From: http://docs.oracle.com/html/E24089_42/ha_setup.htm#sthref833 If the SLB is configured to use T ...

  9. Vector 二维数组 实现

    1.C++实现动态二维数组 int **p; p = ]; //注意,int*[10]表示一个有10个元素的指针数组 ; i < ; ++i) { p[i] = ]; } 2.利用指针数组实现二 ...

  10. C C++ POSIX 的一些 IO 操作

    一些 C C++ POSIX 的 IO 操作总结 文件-内存之间 内存-内存之间 POSIX 有无缓冲的 IO 操作 对文件的操作,读文件至内存,从内存写至文件 // 读文件至内存buf中 void ...