求助一个关于 socket,多线程的问题!!!

2014-12-05 20:33:43 +08:00
 tommark
下面这段代码EchoBackWorker类是一个循环处理socket的子线程,工作的时候会创建出多个实例来处理,SimpleApp是应用逻辑,socket服务器在accpet到客户端请求后会把调用SimpleApp::do_work(),然后do_work会将传递的clientsocket传给全局变量g_client,然后利用event通知EchoBackWorker去处理。现在的问题是,在
g_start_accept = CreateEvent(NULL, FALSE, TRUE, NULL);
设置为TRUE时EchoBackWorker::_loop会莫名其妙的被写成false,造成子线程推出,设置成FALSE后就没有这个问题了。
但是不知道为什么设置成TRUE会造成这个问题,请大家帮忙看看!!!!
HANDLE g_start_search;
HANDLE g_start_accept;
SOCKET g_client;

//////////////////////////////////////////////////////////////////////////
// 功能:转发线程类
//////////////////////////////////////////////////////////////////////////
class EchoBackWorker : public Thread {
add_thread_factory;
bool _loop;
char _recvbuf[DEFAULT_BUFLEN];

public:
unsigned run() {
SOCKET client;
while (_loop)
{
WaitForSingleObject(g_start_search, INFINITE);
client = g_client;
SetEvent(g_start_accept);
int received = recv(client, _recvbuf, DEFAULT_BUFLEN, 0);
_recvbuf[received] = 0;
if (received == SOCKET_ERROR) {
printf("\nrecv error: %d, handle: %d", WSAGetLastError(), _handle);
}
if (SOCKET_ERROR == send(client, _recvbuf, received, 0)) {
printf("\nsend error: %d, handle: %d", WSAGetLastError(), _handle);
}
closesocket(client);
connections++; // 相应连接计数
}
log_warning("worker %d exit, _loop = %d.", _handle, _loop);
return 0;
}

void stop() {
// _loop = false;
WaitForSingleObject(_handle, INFINITE);
}

private:
EchoBackWorker() : _loop(true) {}
~EchoBackWorker(){}
};

const int maxThread = 4;
class SimpleApp : public App {
concurrent::JobManger<SOCKET> _jobMgr;
public:
int init(){
g_start_accept = CreateEvent(NULL, FALSE, TRUE, NULL);
g_start_search = CreateEvent(NULL, FALSE, FALSE, NULL);

// 初始化任务管理器,创建搜索线程
if (_jobMgr.init(maxThread)) // +1: 给转发线程
{
log_error("fail to init job manager.");
return 1;
}

// 创建搜索线程
for (int i = 0; i < maxThread; ++i) {
_jobMgr.add_worker(ThreadFactory::create<EchoBackWorker>());
}

// 创建测试线程
_beginthreadex(NULL, 0, performance, NULL, 0, 0);
return 0;
}

int do_work(SOCKET& client) {
g_client = client;
SetEvent(g_start_search);
WaitForSingleObject(g_start_accept, INFINITE);
return 0;
}

void stop() {
CloseHandle(g_start_accept);
CloseHandle(g_start_search);
}
};
2621 次点击
所在节点    程序员
2 条回复
X140Yu
2014-12-06 15:59:10 +08:00
CreateEvent的第几个参数?
tommark
2014-12-06 16:08:12 +08:00
@X140Yu 第三个参数

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/151827

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX