c++ 多线程 事件EVENT

事件是内核对象。事件的常用函数:


CreateEvent

函数功能:创建事件

函数原型:

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES lpEventAttributes,

BOOL bManualReset,

BOOL bInitialState,

LPCTSTR pName

);

第一个参数表示安全控制,一般直接传入NULL。

第二个参数确定事件是手动置位还是自动置位,传入TRUE表示手动置位,传入FALSE表示自动置位。如果为自动置位,则对该事件调用WaitForSingleObject()后会自动调用ResetEvent()使事件变成未触发状态。

第三个参数表示事件的初始状态,传入TRUE表示已触发。

第四个参数表示事件的名称,传入NULL表示匿名事件。


OpenEvent

函数功能:根据名称获得一个事件句柄。

函数原型:

HANDLE OpenEvent(

DWORD dwDesiredAccess,

BOOL bInheritHandle,

LPCTSTRl pName //名称

);

函数说明:

第一个参数表示访问权限,对事件一般传入EVENT_ALL_ACCESS。

第二个参数表示事件句柄继承性,一般传入TRUE即可。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libevent是一个事件驱动的网络编程库,它提供了高效的事件处理机制和多线程支持。在libevent中,HTTP服务器可以使用多线程来处理并发请求。下面是一个简单的HTTP服务器的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <event2/event.h> #include <event2/http.h> #include <event2/buffer.h> static void http_handler(struct evhttp_request *req, void *arg) { struct evbuffer *buf = evbuffer_new(); if (buf == NULL) { fprintf(stderr, "failed to create response buffer\n"); evhttp_send_error(req, HTTP_INTERNAL, "Internal server error"); return; } evbuffer_add_printf(buf, "Hello, world!"); evhttp_add_header(evhttp_request_get_output_headers(req), "Content-Type", "text/plain"); evhttp_send_reply(req, HTTP_OK, "OK", buf); evbuffer_free(buf); } int main(int argc, char **argv) { struct event_base *base; struct evhttp *http; struct evhttp_bound_socket *handle; base = event_base_new(); if (base == NULL) { fprintf(stderr, "failed to create event base\n"); return 1; } http = evhttp_new(base); if (http == NULL) { fprintf(stderr, "failed to create HTTP server\n"); return 1; } evhttp_set_cb(http, "/", http_handler, NULL); handle = evhttp_bind_socket_with_handle(http, "127.0.0.1", 8080); if (handle == NULL) { fprintf(stderr, "failed to bind socket\n"); return 1; } event_base_loop(base, 0); evhttp_free(http); event_base_free(base); return 0; } ``` 在这个示例中,我们创建了一个event_base和一个evhttp结构体,并将HTTP请求处理函数注册到evhttp中。然后,使用evhttp_bind_socket_with_handle函数绑定一个监听地址和端口,并进入事件循环。当有新的HTTP请求到达时,事件循环将自动调用我们注册的处理函数进行处理。 如果需要支持多线程,我们可以使用event_base_new_with_config函数创建一个带有配置的event_base,然后使用event_config_set_num_cpus_hint函数指定处理事件的线程数。例如,我们可以将处理事件的线程数设置为CPU核心数的两倍: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <event2/event.h> #include <event2/http.h> #include <event2/buffer.h> static void http_handler(struct evhttp_request *req, void *arg) { struct evbuffer *buf = evbuffer_new(); if (buf == NULL) { fprintf(stderr, "failed to create response buffer\n"); evhttp_send_error(req, HTTP_INTERNAL, "Internal server error"); return; } evbuffer_add_printf(buf, "Hello, world!"); evhttp_add_header(evhttp_request_get_output_headers(req), "Content-Type", "text/plain"); evhttp_send_reply(req, HTTP_OK, "OK", buf); evbuffer_free(buf); } int main(int argc, char **argv) { struct event_base *base; struct event_config *config; struct evhttp *http; struct evhttp_bound_socket *handle; config = event_config_new(); if (config == NULL) { fprintf(stderr, "failed to create event config\n"); return 1; } event_config_set_num_cpus_hint(config, sysconf(_SC_NPROCESSORS_ONLN) * 2); base = event_base_new_with_config(config); if (base == NULL) { fprintf(stderr, "failed to create event base\n"); return 1; } http = evhttp_new(base); if (http == NULL) { fprintf(stderr, "failed to create HTTP server\n"); return 1; } evhttp_set_cb(http, "/", http_handler, NULL); handle = evhttp_bind_socket_with_handle(http, "127.0.0.1", 8080); if (handle == NULL) { fprintf(stderr, "failed to bind socket\n"); return 1; } event_base_loop(base, 0); evhttp_free(http); event_base_free(base); return 0; } ``` 在这个示例中,我们使用event_config_new函数创建一个event_config结构体,并使用event_config_set_num_cpus_hint函数设置处理事件的线程数。然后,使用event_base_new_with_config函数创建一个带有配置的event_base,其他部分与之前的示例相同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值