我正在使用C,pthreads和套接字在Linux中编写应用程序。多线程访问数据结构
这将是客户端 - 服务器应用程序,服务器将具有N + 2个线程,其中N - 活动客户端的数目,一个线程用于接受新连接并为客户创造和最后一个线程将被接受用户输入。
我将使用链表来保存一些数据,这将是有关我的应用程序,与每一位客户都会有我的列表中相关联的一个节点。那些客户端线程会以一定的时间间隔更新存储在其节点中的信息,可能是一秒钟,可能是两分钟,它会动态更改。
现在问题在于,如果用户请求它,存储在链接列表中的信息需要写入标准输出。当然,在写作时我应该获得互斥体。我担心整个列表中的一个互斥量会妨碍性能。
我在考虑将互斥锁与每个节点关联起来,但它会使一些指定节点的移除复杂化(首先,我需要确保'stdout writer'线程不会遍历列表,我也会需要获取我的节点的互斥体和前一个节点来改变指向下一个节点的指针,依此类推 - 或者我需要遍历所有前一个节点,或者我需要创建双链表)。
所以我想知道如果涉及多个互斥体的解决方案,甚至更好用更复杂的代码,条件和这一切的锁定,等待和解锁。
那么这又怎么样呢,而不是物理地去除节点,我将它们标记为“未使用”,这样在写入数据和删除期间就不会有任何问题,因为我不需要访问任何其他节点,如果读者想要遍历他将锁定它的列表,并且只有当列表没有被读者遍历时才会发生列表添加。 – Andna
你可以做到这一点 - 但考虑是否值得。添加新节点将搜索未使用节点,然后分配一个,如果没有未使用的节点。遍历列表必须足够聪明以跳过未使用的列表。删除会更容易一些,因为您不必调整链接,但仍然需要使用锁来标记未使用的节点,所以不妨将其从列表中拉出。到处都是,我认为将节点标记为未使用会使代码变得更加复杂,而没有太多收获。 – twalberg
好吧,我想我会使用读写锁,据我所知,我可以保证作者将有权限读者访问列表。 – Andna