【发布时间】:2015-08-27 20:35:36
【问题描述】:
我有一个扮演网络服务器角色的应用程序,它将 pthread_create 多个线程,每个线程将侦听特定的 TCP 端口并接受多个 TCP 套接字连接。 现在,例如 60 秒后,所有网络客户端(TCP 套接字客户端)都已关闭(但我的应用程序仍在运行这些线程并侦听这些端口),我如何收集数据(例如收到的总字节数)我的应用程序创建的那些线程?
我目前使用的一个解决方案是:在每个socket的accept()中,当有新数据到来时,对应的线程会用pthread_mutex_t更新一个静态变量。但我怀疑这是互斥锁的低效率和浪费时间。
有没有无锁的方法来做到这一点? 如果有任何“per_cpu”计数器的解决方案,就像它在网络驱动程序中使用/没有锁定/互斥锁一样? 或者,当从套接字(read())接收 n 个字节时,我不更新 Receiver_Total_Bytes。相反,我继续计算线程内的总字节数。但问题是,如何从未完成的线程中获取总字节数?
===sudo 代码===
register long Receiver_Total_Bytes = 0;
static pthread_mutex_t Summarizer_Mutex = PTHREAD_MUTEX_INITIALIZER;
void add_server_transfer_bytes(register long bytes )
{
pthread_mutex_lock( &Summarizer_Mutex );
Receiver_Total_Bytes += bytes;
pthread_mutex_unlock( &Summarizer_Mutex );
}
void reset_server_transfer_bytes( )
{
pthread_mutex_lock( &Summarizer_Mutex );
Receiver_Total_Bytes = 0;
pthread_mutex_unlock( &Summarizer_Mutex );
}
然后在socket中读取:
if((n = read(i, buffer, bytes_to_be_read)) > 0) {
............
add_server_transfer_bytes(n);
【问题讨论】:
标签: c linux multithreading networking