线程并发,用标志位同步时要小心
static INT bUseCount = 0;
static void socket_startup()
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2,2);
if (bUseCount++ == 0) {
WSAStartup(wVersionRequested, &wsaData);
}
}
int socket_create(int domain, int type)
{
socket_startup();
return socket(domain, type, 0);
}
void proc_0(void * params)
{
int fd_listen;
fd_listen = socket_create(1, SOCK_STREAM);
...
}
_beginthread(proc_0, 0, 0);
_beginthread(proc_1, 0, 0);
_beginthread(proc_2, 0, 0);
三个线程并发,调用socket之前WSAStartup可能未执行!
对变量的访问加锁可解决这个问题
mutex.Lock();
if (bUseCount++ == 0) {
WSAStartup(wVersionRequested, &wsaData);
}
mutex.Unlock();
static INT bUseCount = 0;
static void socket_startup()
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2,2);
if (bUseCount++ == 0) {
WSAStartup(wVersionRequested, &wsaData);
}
}
int socket_create(int domain, int type)
{
socket_startup();
return socket(domain, type, 0);
}
void proc_0(void * params)
{
int fd_listen;
fd_listen = socket_create(1, SOCK_STREAM);
...
}
_beginthread(proc_0, 0, 0);
_beginthread(proc_1, 0, 0);
_beginthread(proc_2, 0, 0);
三个线程并发,调用socket之前WSAStartup可能未执行!
对变量的访问加锁可解决这个问题
mutex.Lock();
if (bUseCount++ == 0) {
WSAStartup(wVersionRequested, &wsaData);
}
mutex.Unlock();
本文探讨了在多线程环境中使用标志位进行同步时可能遇到的问题,特别是当多个线程并发调用同一函数时,如何确保关键代码段正确执行。通过引入互斥锁(mutex)来解决线程安全问题。
1246

被折叠的 条评论
为什么被折叠?



