多线程互斥与同步

事件对象:

HANDLE CreateEvent(

  LPSECURITY_ATTRIBUTES lpEventAttributes,

  BOOL bManualReset,//是否人工重置

  BOOL bInitialState,//创建的是否有信号状态

  LPCTSTR lpName//事件是否命名

);

当创建的是人工重置的事件对象,当为有信号状态时所有等待该事件对象的线程均可执行

对于线程间的同步一般不要创建人工重置的事件对象

对于自动重置的事件对象,当变为有信号状态时只有一个线程能得到该时间对象

临界区(又叫关键代码段):

void EnterCriticalSection(//获得临界区资源
  LPCRITICAL_SECTION lpCriticalSection
);
void InitializeCriticalSection(//创建临界区对象
  LPCRITICAL_SECTION lpCriticalSection
);
void LeaveCriticalSection(//释放临界区对象所有权
  LPCRITICAL_SECTION lpCriticalSection
);
void DeleteCriticalSection(//释放没有被拥有的临界区对象所有资源
  LPCRITICAL_SECTION lpCriticalSection
);

线程死锁:线程1用有临界区对象A,等待临界区对象2的所有权,线程2拥有临界区对象B,等待临界区对象A的所有权。这样就造成死锁。

 

互斥对象、事件对象属于内核对象,利用内核对象进行线程同步,速度较慢,但可以在多个进程中的各个线程间进行同步

关键代码段工作在用户方式下,同步速度较快,但容易进入死锁状态,且无法设置超时值。

 

MFC中可以再类的构造函数中调用initializeCriticialSection();

在析构函数中调用deleteCriticalsection();

在要保护的代码段调用entercriticalsection();记住一定要在保护的代码末调用leavecriticalsection()。

 

基于消息的异步套接字编程:

Windows套接字在两种模式下执行I/O操作:阻塞和费阻塞模式。

Windows sockets的异步玄子函数WSAAsyncSelect()提供了消息机制的网络时间玄子,当使用它等级的网络事件发生时,windows应用程序相应的窗口函数将受到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。

int WSAAsyncSelect(//请求windows关于网络消息的通知
  SOCKET s,
  HWND hWnd,
  unsigned int wMsg,
  long lEvent
); When one of the nominated network events occurs on the specified socket s, the application window hWnd receives message wMsg. The wParam parameter identifies the socket on which a network event has occurred. The low word oflParam specifies the network event that has occurred.
int WSAEnumProtocols(//获得可用的传输协议信息
  LPINT lpiProtocols,
  LPWSAPROTOCOL_INFO lpProtocolBuffer,
  LPDWORD lpdwBufferLength
);
SOCKET WSASocket(//用于创建套接字(扩展的函数相对socket())
  int af,//地址族
  int type,//套接字类型
  int protocol,//0,将自动选择协议
  LPWSAPROTOCOL_INFO lpProtocolInfo,//if Null,根据前三个参数
  GROUP g,//保留地
  DWORD dwFlags//套接字属性的描述
);
int WSARecvFrom(//接收
  SOCKET s,
  LPWSABUF lpBuffers,//包含一个缓冲区的指针和缓冲区的长度
  DWORD dwBufferCount,//指定WSABUF结构体个数
  LPDWORD lpNumberOfBytesRecvd,//接收字节数返回out
  LPDWORD lpFlags,
  struct sockaddr* lpFrom,
  LPINT lpFromlen,
  LPWSAOVERLAPPED lpOverlapped,//对于非重叠套接字 最后两个可忽略
  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
int WSASendTo(//发送数据
  SOCKET s,
  LPWSABUF lpBuffers,
  DWORD dwBufferCount,
  LPDWORD lpNumberOfBytesSent,
  DWORD dwFlags,
  const struct sockaddr* lpTo,
  int iToLen,
  LPWSAOVERLAPPED lpOverlapped,
  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
struct hostent* FAR gethostbyname(//返回hostent结构体指针
  const char* name
);
typedef struct hostent {//返回hostent结构体指针
  char FAR* h_name;
  char FAR  FAR** h_aliases;
  short h_addrtype;
  short h_length;
  char FAR  FAR** h_addr_list;
} hostent;

 

struct HOSTENT* FAR gethostbyaddr(
  const char* addr,//地址指针
  int len,//地址长度
  int type//地址类型
);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值