37 #include "ac/getopt.h"
39 #ifdef USE_MULTITHREAD
42 #include "ac/pthread.h"
52 class A :
public InUse {
57 A(
unsigned l) : label(l) {};
60 unsigned Label(
void)
const {
return label; };
61 void Set(
unsigned w) {
66 d += 1.e-6 * (rand() % rst);
74 unsigned Get(
void)
const {
return who; };
87 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
88 pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
117 f2(arg->i, arg->n, arg->cnt);
119 pthread_mutex_lock(&mutex);
121 silent_cout(
"f: count " << *arg->c + 1 <<
" => " << *arg->c << std::endl);
123 silent_cout(
"f: finished" << std::endl);
124 pthread_cond_signal(&cond);
126 pthread_mutex_unlock(&mutex);
133 main(
int argc,
char* argv[])
135 unsigned size = 1000;
141 char *s = std::strrchr(argv[0],
DIR_SEP);
149 std::cout <<
"usage: " << s <<
" [lnsSt]" << std::endl
150 <<
"\t-l <loops>" << std::endl
151 <<
"\t-n <size>" << std::endl
152 <<
"\t-s <sleeptime>" << std::endl
153 <<
"\t-S <random sleeptime>" << std::endl
154 <<
"\t-t <threads number>" << std::endl;
160 int opt =
getopt(argc, argv,
"l:n:s:S:t:");
168 loops = strtoul(
optarg, &next, 10);
172 size = strtoul(
optarg, &next, 10);
176 dst = strtoul(
optarg, &next, 10);
180 rst = strtoul(
optarg, &next, 10);
184 nt = strtoul(
optarg, &next, 10);
200 A** ppA =
new A*[size];
201 for (
unsigned i = 0; i < size; i++) {
205 for (
unsigned i = 0; i < nt; i++) {
207 arg[i].i.Init(ppA, size);
212 if (i == 0)
continue;
214 sem_init(&arg[i].s, 0, 0);
215 pthread_create(&arg[i].t, NULL, f, &arg[i]);
218 for (
unsigned k = 0; k < 10; k++) {
219 arg[0].i.ResetAccessData();
222 for (
unsigned i = 1; i < nt; i++) {
226 f2(arg[0].i, arg[0].n, arg[0].cnt);
229 pthread_mutex_lock(&mutex);
231 silent_cout(
"main: count " << c << std::endl);
232 pthread_cond_wait(&cond, &mutex);
233 silent_cout(
"main: wait is over; count" << c << std::endl);
235 pthread_mutex_unlock(&mutex);
239 fprintf(stderr,
"cnt = {%u", arg[0].cnt);
240 for (
unsigned i = 1; i < nt; i++) {
241 fprintf(stderr,
", %u", arg[i].cnt);
244 fprintf(stderr,
"} = %u\n", c);
247 memset(who, 0,
sizeof(who));
248 for (
unsigned i = 0; i < size; i++) {
249 who[ppA[i]->Get()]++;
253 fprintf(stderr,
"who = {%u", who[0]);
254 for (
unsigned i = 1; i < nt; i++) {
255 fprintf(stderr,
", %u", who[i]);
258 fprintf(stderr,
"} = %u\n", c);
261 for (
unsigned i = 1; i < nt; i++) {
264 pthread_join(arg[i].t, NULL);
277 std::cerr <<
"need --enable-multithread" << std::endl;
#define MBSLEEP_ISZERO(mbs)
bool bGetNext(T &TReturn) const
int mbsleep(const mbsleep_t *t)
static std::stack< cleanup * > c
int getopt(int argc, char *const argv[], const char *opts)
bool bGetFirst(T &TReturn) const
int mbsleep_real2sleep(doublereal d, mbsleep_t *t)