我有一个速度关键的多线程程序,涉及树形数据结构。实现如下:
typedef struct
{
// data pertaining to linkages, defining the architecture of the tree
int parent_node;
int child_node[MAX_CHILD_NODES];
int number_of_children;
// data pertaining to info at each node
float interesting_info_A;
char interesting_info_B[STRING_LEN];
long interesting_info_C;
}
node_type;
node_type node[MAX_NUMBER_OF_NODES];
CRITICAL_SECTION node_critsec[MAX_NUMBER_OF_NODES];
程序通过node_critsec[]控制进入和离开关键部分。所以当我需要处理节点n的interesting_info_A/B/C时,我会进入该节点的临界区(node_critsec[n]),做好处理后再离开。该程序绕着树结构游走,沿着父子链接走各种复杂的路径。程序还会增加树的大小,即添加新节点,并相应地修改其他节点的父子链接(树不会缩小)。为了避免死锁的风险,我尽量确保每个线程一次只锁定一个节点。但是,如果我要添加一个新节点,那么我可能会想锁定该节点的父节点,以便我可以调整其子节点列表。让这一切正常工作而又不出现死锁或两个线程试图修改同一个节点中的数据是有点棘手的问题。我是否应该遵循一些指导原则来锁定/解锁何时和哪些节点,还是我必须非常聪明地解决可能发生的每种情况?