blob: 789879821fb4a37296af2270d6c5de1a3520015f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
// **********************************************************************
//
// Copyright (c) 2003-2011 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
#include <IceUtil/IceUtil.h>
#include <list>
using namespace std;
namespace
{
IceUtil::Mutex* outputMutex = 0;
class Init
{
public:
Init()
{
outputMutex = new IceUtil::Mutex;
}
~Init()
{
delete outputMutex;
outputMutex = 0;
}
};
Init init;
}
void
mtprint(const string& data)
{
IceUtil::Mutex::Lock sync(*outputMutex);
cout << data << flush;
}
class WorkQueue : public IceUtil::Thread
{
public:
WorkQueue() { }
~WorkQueue() { }
virtual void
run()
{
while(1)
{
string item = nextItem();
if(item == "destroy")
{
break;
}
mtprint("work item: " + item + "\n");
IceUtil::ThreadControl::sleep(IceUtil::Time::seconds(1));
}
}
void
add(const string& item)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor);
if(_queue.empty())
{
_monitor.notify();
}
_queue.push_back(item);
}
private:
string
nextItem()
{
IceUtil::Monitor<IceUtil::Mutex>::Lock lock(_monitor);
while(_queue.empty())
{
_monitor.wait();
}
string item = _queue.front();
_queue.pop_front();
return item;
}
IceUtil::Monitor<IceUtil::Mutex> _monitor;
list<string> _queue;
};
typedef IceUtil::Handle<WorkQueue> WorkQueuePtr;
int
main()
{
try
{
WorkQueuePtr h = new WorkQueue();
IceUtil::ThreadControl control = h->start();
mtprint("Pushing work items");
mtprint(".");
h->add("item1");
mtprint(".");
h->add("item2");
mtprint(".");
h->add("item3");
mtprint(".");
h->add("item4");
mtprint(".");
h->add("item5");
mtprint(".");
h->add("destroy");
mtprint("ok\n");
mtprint("Waiting for WorkQueue to terminate\n");
control.join();
}
catch(const IceUtil::Exception& ex)
{
ostringstream os;
os << ex << "\n";
mtprint(os.str());
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
|