使用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. Linux 下 Solr的搭建与使用(建议jdk1.8以上)

    官方表示solr5之后的版本不再提供对第三方容器的支持(不提供war包了). “旧式”solr.xml格式不再支持,核心必须使用core.properties文件定义. 使用第三方容器的需要自己手动修 ...

  2. 暴力(python)

    输出由1,2,3,4组成的互不相同且无重复的三位数! #方式一 lst = ['1', '2', '3', '4'] res = [] for i in lst: for j in lst: for ...

  3. Educational Codeforces Round 24 题解

    A: 考你会不会除法 //By SiriusRen #include <bits/stdc++.h> using namespace std; #define int long long ...

  4. Github提交本地版本是遇到的问题

    问题如下:*** Please tell me who you are. Run git config --global user.email "you@example.com" ...

  5. Linq学习(三)-基本查询

    一.本将主要介绍内容 从linq,sql,lambda三个角度比较来学习 select.orderby.分页.group by.distinct.子查询.in的用法 1.select 查询用户和它们的 ...

  6. Unity学习-鼠标的常用操作(八)

    本次主要介绍5个鼠标事件 void OnMouseEnter():鼠标进入 void OnMouseExit():鼠标移出 void OnMouseDown():鼠标点击 void OnMouseUp ...

  7. Bootstrap3模态框Modal垂直居中样式

    1,Bootstrap 模态框插件Bootbox垂直居中样式: <!DOCTYPE html> <html lang="en"> <head> ...

  8. [转]Linux下/proc目录简介

    1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文 ...

  9. HTML CSS, JavaScript 计算器

    效果图: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  10. 【Caffe】Ubuntu16.04上配置安装caffe(Only CPU)

    一.首先看看自己的系统,Ubuntu16.04,cpu,没有Nvidia,没有opencv 二.安装依赖包 安装protobuf,leveldb,snappy,OpenCV,hdf5, protobu ...