我正在开展一个大型项目,我需要每隔n分钟监控一个结构的过程。
结构的每个实例都可能拥有自己的时间长度,以便进程能够完成它将要执行的操作。
举个例子,让我说我监控客户端连接,struct client。
当客户端被实例化时,我希望合并一个方法,如:
void add_Client_Monitor (client_t * client, int seconds)
然后,add_Client_Monitor应该能够创建一个定时器事件,该事件将在规定的秒数之后触发,并且还作用于客户端结构,即通过如下方法:
void timer_Update_Client(client_t * client)
由于
答案 0 :(得分:1)
你可以使用一个线程池(就像这些github.com/Pithikos/C-Thread-Pool或这些一个github.com/mbrossard/threadpool)。 在add_Client_Monitor函数中,您可以将作业传递给具有要运行的特定函数的线程池。 举个简单的例子:
#include "thpool.h"
typedef struct monitor_func_args {
client_t* client;
int seconds;
} monitor_func_args;
void* client_monitor_func(void* args){
struct timeval timeout;
timeout.tv_sec = ((monitor_func_args*) args)->seconds;
timeout.tv_usec = 0;
while(1) {
// Do your stuff
select (0 ,NULL, NULL, NULL, &timeout); // "sleep"
}
}
void add_client_monitor (threadpool pool, client_t * client, int seconds) {
monitor_func_args* args = (monitor_func_args*) malloc(sizeof(monitor_func_args));
args->client = client;
args->seconds = seconds;
thpool_add_work(pool, client_monitor_func, (void*) args);
}
int main(){
threadpool thpool = thpool_init(10); // pool with 10 threads
client_t* client; // get it from somewhere
int timeout // get it from somewhere
add_client_monitor(thpool, &client, timeout)
thpool_destroy(thpool);
return 0;
}
我没有看过这些线程池实现的整个代码,但它们似乎是正确的。 当然,还有很多其他的可以使用。