On Dec 1 16:45, Xiaofeng Liu via cygwin wrote: > Lock protection and lock-free should never be mixed ! > https://cygwin.com/git/gitweb.cgi?p=newlib-cygwin.git;a=blob;f=winsup/cygwin/thread.h;hb=1f42dc2bcf58d3b8629eb13d53de3f69fc314b47#l110 > > 110 template <class list_node> inline void 111 List_insert (list_node > *&head, list_node *node) 112 { 113 if (!node) 114 return; 115 do 116 > node->next = head; 117 while (InterlockedCompareExchangePointer ((PVOID > volatile *) &head, 118 node, > node->next) != node->next); 119 } 120 121 template <class list_node> inline > void 122 List_remove (fast_mutex &mx, list_node *&head, list_node *node) 123 > { 124 if (!node) 125 return; 126 mx.lock (); 127 if (head) 128 > { 129 if (InterlockedCompareExchangePointer ((PVOID volatile *) &head, > 130 node->next, node) != node) > 131 { 132 list_node *cur = head; 133 134 while > (cur->next && node != cur->next) 135 cur = cur->next; 136 > if (node == cur->next) 137 cur->next = cur->next->next; 138 > } 139 } 140 mx.unlock (); 141 } > The symptom I met is a job hang with the following stack: > #0 0x000000007711c2ea in ntdll!ZwWaitForMultipleObjects () from > /cygdrive/c/Windows/SYSTEM32/ntdll.dll > #1 0x000007fefd111430 in KERNELBASE!GetCurrentProcess () from > /cygdrive/c/Windows/system32/KERNELBASE.dll > #2 0x0000000076fc06c0 in WaitForMultipleObjects () from > /cygdrive/c/Windows/system32/kernel32.dll > #3 0x00000001800458ac in cygwait(void*, _LARGE_INTEGER*, unsigned int) () > from /usr/bin/cygwin1.dll > #4 0x000000018013d029 in pthread_cond::~pthread_cond() () from > /usr/bin/cygwin1.dll > #5 0x000000018013d0dd in pthread_cond::~pthread_cond() () from > /usr/bin/cygwin1.dll > #6 0x0000000180141196 in pthread_cond_destroy () from /usr/bin/cygwin1.dll > #7 0x0000000180116d5b in _sigfe () from /usr/bin/cygwin1.dll > #8 0x0000000100908e38 in > std::_Sp_counted_ptr_inplace<std::__future_base::_Task_state<std::function<void > ()>, std::allocator<int>, void ()>, std::allocator<int>, > (__gnu_cxx::_Lock_policy)2>::_M_dispose() () > The problem with the current implementation for concurrent insert and delete > is explained at WikipediaNon-blocking linked list > > My question is how to solve this ? Adding lock protection in List_insert > (removing lock-freee) or implementing a complete lock-free List based on > Harris's solution to use two CAS?
First of all, please, please, please fix your MUA! Just like your mails to cygwin-patches a couple of weeks ago, your mails are pretty much unreadable due to broken line wrapping. Back to business: This code is working since 2003. So, is that just a theoretical problem, or a practical one? If the latter, what is broken exactly? However, since you're asking, a lockless implementation where appropriate is always welcome. Thanks, Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Maintainer cygwin AT cygwin DOT com Red Hat
signature.asc
Description: PGP signature