当前位置: 技术问答>linux和unix
线程同步问题
来源: 互联网 发布时间:2015-12-07
本文导语: 现在有这样一种情况 一个线程采集图像到buf缓冲区 采完后发个pthread_cond_broadcast信号 有四个线程pthread_cond_wait等待信号向四个客户端发送buf里的数据 如果数据比较大的话 就可能正在发送数据的时候 ...
现在有这样一种情况
一个线程采集图像到buf缓冲区 采完后发个pthread_cond_broadcast信号 有四个线程pthread_cond_wait等待信号向四个客户端发送buf里的数据 如果数据比较大的话 就可能正在发送数据的时候 采集覆盖掉没发完的数据
采集线程如何等发送完数据在采集?
一个线程采集图像到buf缓冲区 采完后发个pthread_cond_broadcast信号 有四个线程pthread_cond_wait等待信号向四个客户端发送buf里的数据 如果数据比较大的话 就可能正在发送数据的时候 采集覆盖掉没发完的数据
采集线程如何等发送完数据在采集?
|
给个大概流程吧
初始化--------------------------------
initialize_collection_buf_pool()//初始化采集内存池
{
预分配n片足够大的内存并用链表collect_list管理;
pthread_rwlock_init
...
}
initialize_send_buf_pool();//初始化发送内存池
{
创建内存池链表send_list
pthread_rwlock_init
...
}
注意,发送池和收集池各有一个rwlock,在对链表进行push或者pop操作时需要rwlock保护
采集线程----------------------------------
get_collection_buf();//从链表collect_list中取一个可用内存,并删除这个节点.需rwlock保护
...
采集数据;
...
put_buf_into_send_pool();//把采集好数据的内存块放到发送池send_list,设置该内存块发送计数send_count为0,需rwlock保护。
发送线程----------------------------------------------
get_next_send_buf()//这里需rwlock保护
send()
wait_for_send_complete()
...
send_count++;//原子操作
if(send_count == 4)//(4个线程都已经发送完),
{
从发送pool内删除该内存块; //需rwlock保护
put_buf_into_collection_pool();//返还该内存到收集池,需rwlock保护
}
初始化--------------------------------
initialize_collection_buf_pool()//初始化采集内存池
{
预分配n片足够大的内存并用链表collect_list管理;
pthread_rwlock_init
...
}
initialize_send_buf_pool();//初始化发送内存池
{
创建内存池链表send_list
pthread_rwlock_init
...
}
注意,发送池和收集池各有一个rwlock,在对链表进行push或者pop操作时需要rwlock保护
采集线程----------------------------------
get_collection_buf();//从链表collect_list中取一个可用内存,并删除这个节点.需rwlock保护
...
采集数据;
...
put_buf_into_send_pool();//把采集好数据的内存块放到发送池send_list,设置该内存块发送计数send_count为0,需rwlock保护。
发送线程----------------------------------------------
get_next_send_buf()//这里需rwlock保护
send()
wait_for_send_complete()
...
send_count++;//原子操作
if(send_count == 4)//(4个线程都已经发送完),
{
从发送pool内删除该内存块; //需rwlock保护
put_buf_into_collection_pool();//返还该内存到收集池,需rwlock保护
}