事件对象:
HANDLE CreateEvent(
);
当创建的是人工重置的事件对象,当为有信号状态时所有等待该事件对象的线程均可执行
对于线程间的同步一般不要创建人工重置的事件对象
对于自动重置的事件对象,当变为有信号状态时只有一个线程能得到该时间对象
临界区(又叫关键代码段):
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中可以再类的构造函数中调用initializeCriticialSecti
在析构函数中调用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//地址类型
);