@@ -53,26 +53,40 @@ public bool Insert(string word)
53
53
54
54
public bool Remove ( out string item )
55
55
{
56
- item = default ( string ) ;
57
-
58
56
// 58 ms, 3,000 calls
57
+ SplayHeap < string > . Heap localCopy ;
59
58
lock ( _lockObject )
60
59
{
61
60
while ( ! _token . IsCancellationRequested && SplayHeap < string > . IsEmpty ( _set ) )
62
61
// 33 ms, 1,609 calls
63
62
Monitor . Wait ( _lockObject ) ;
64
63
65
64
if ( SplayHeap < string > . IsEmpty ( _set ) )
65
+ {
66
+ item = default ( string ) ;
66
67
return false ;
68
+ }
67
69
68
70
// 2 ms, 3,000 calls
69
- item = SplayHeap < string > . FindMin ( _set ) ;
70
- // 2 ms, 3,000 calls
71
- _set = SplayHeap < string > . DeleteMin ( _set ) ;
71
+ localCopy = _set ;
72
+ _set = SplayHeap < string > . DeleteMin ( localCopy ) ;
72
73
}
73
74
75
+ // 2 ms, 3,000 calls
76
+ item = SplayHeap < string > . FindMin ( localCopy ) ;
74
77
return true ;
75
78
}
79
+
80
+ public bool IsEmpty
81
+ {
82
+ get
83
+ {
84
+ lock ( _lockObject )
85
+ {
86
+ return SplayHeap < string > . IsEmpty ( _set ) ;
87
+ }
88
+ }
89
+ }
76
90
}
77
91
78
92
[ TestClass ]
@@ -81,7 +95,7 @@ public class DictionaryLockTests : DictionaryTests
81
95
// 157 ms, 10 calls
82
96
private void InsertAction ( object ojb )
83
97
{
84
- var map = ( DictionaryLock < string > ) ojb ;
98
+ var map = ( DictionaryLock < string > ) ojb ;
85
99
for ( var i = 0 ; i < Count ; i ++ )
86
100
{
87
101
// 5 ms, 3,000 calls
@@ -96,12 +110,12 @@ private void InsertAction(object ojb)
96
110
// 98 ms, 10 calls
97
111
private static void RemoveAction ( object ojb )
98
112
{
99
- var map = ( DictionaryLock < string > ) ojb ;
113
+ var map = ( DictionaryLock < string > ) ojb ;
100
114
for ( var i = 0 ; i < Count ; i ++ )
101
115
{
102
116
var removed = map . Remove ( out var item ) ;
103
117
if ( ! removed )
104
- return ;
118
+ break ;
105
119
106
120
var unused = Convert . FromBase64String ( item ) ;
107
121
// Console.WriteLine(string.Join(", ", unused));
@@ -124,6 +138,7 @@ public void Test1()
124
138
}
125
139
126
140
Task . WaitAll ( taskList . ToArray ( ) ) ;
141
+ Assert . IsTrue ( dictionary . IsEmpty ) ;
127
142
}
128
143
}
129
144
}
0 commit comments