1 #define msecsleep(x) (x)
26 #include "atomic_smart_ptr.h"
27 #include "atomic_queue.h"
28 #include "xthread.cpp"
39 atomic<int> g_queue1_total = 0, g_queue2_total = 0, g_queue3_total = 0;
44 for(
int j = 0; j < SIZE; j++) {
48 if(g_cnt.compare_set_strong(i, i+1))
break;
66 queue2.push(
new int(i));
73 int *t = (
int*)queue2.atomicFront();
76 if(queue2.atomicPop(t)) {
87 atomic_queue_reserved_key key = queue3.atomicFront(&x);
89 if(queue3.atomicPop(key)) {
101 main(
int argc,
char **argv)
103 for(
int i = 0; i < NUM_THREADS; i++) {
112 queue2.push(
new int(i));
119 for(
int i = 0; i < NUM_THREADS; i++) {
121 const int *t =queue2.atomicFront();
124 if(queue2.atomicPop(t)) {
133 atomic_queue_reserved_key key =queue3.atomicFront(&x);
135 if(queue3.atomicPop(key)) {
144 if(!queue1.
empty() || !queue2.empty() || !queue3.empty() ||
145 (g_queue1_total != 0) || (g_queue3_total != 0) || (g_queue2_total != 0)) {
146 printf(
"\ntest1:failed queue1size=%d, queue1total=%d, queue2size=%d, queue2total=%d, queue3size=%d, queue3total=%d\n",
147 queue1.size(), (int)g_queue1_total,
148 queue2.size(), (int)g_queue2_total,
149 queue3.size(), (int)g_queue3_total);
152 std::thread threads[NUM_THREADS];
154 for(
int i = 0; i < NUM_THREADS; i++) {
155 std::thread th( &start_routine);
159 for(
int i =0; i < SIZE * NUM_THREADS; i++) {
160 if(queue1.
empty())
continue;
161 int x = queue1.
front();
166 for(
int i = 0; i < NUM_THREADS; i++) {
171 if(queue1.
empty())
break;
172 int x = queue1.
front();
178 if(queue2.empty())
break;
179 int *x = queue2.front();
180 g_queue2_total -= *x;
184 if(queue3.empty())
break;
185 int x = queue3.front();
191 if(!queue1.
empty() || !queue2.empty() || !queue3.empty() ||
192 (g_queue1_total != 0) || (g_queue3_total != 0) || (g_queue2_total != 0)) {
193 printf(
"\ntest2:failed queue1size=%d, queue1total=%d, queue2size=%d, queue2total=%d, queue3size=%d, queue3total=%d\n",
194 queue1.size(), (int)g_queue1_total,
195 queue2.size(), (int)g_queue2_total,
196 queue3.size(), (int)g_queue3_total);
200 printf(
"succeeded\n");