int sthread_cond_signal(sthread_cond_t *cond) { if(cond->cond) { int i; __DEBUG_PRINT(("tid %d signal 1 \n", __selftid)); setup_sync(); __DEBUG_PRINT(("tid %d signal 2 \n", __selftid)); wait_to_enter(); __DEBUG_PRINT(("tid %d signal 3 \n", __selftid)); __mvspace_commit(); v_next_and_wait(); __DEBUG_PRINT(("tid %d signal 3 \n", __selftid)); __mvspace_pull(); for(i=0;i<MAXTHREADS;i++) post_sem(cond->cond->locks, i); __DEBUG_PRINT(("tid %d signal 4 \n", __selftid)); leave_sync(); __DEBUG_PRINT(("tid %d signal 5 \n", __selftid)); return 0; } return -1; }
int push(const T ele) { sem_t *p_sem; p_sem = &this->p_sem; mQueue.push(ele); // 等待信号量 return post_sem(p_sem); };
int sthread_barrier_wait(sthread_barrier_t *barrier) { if(barrier->barrier) { setup_sync(); //setup_barrier_sync(barrier->barrier); __DEBUG_PRINT(("tid %d barrier1\n", __selftid)); wait_to_enter(); __mvspace_commit(); __threadpool[__selftid].state = E_STOPPED; __threadpool[__selftid].barrier = barrier->barrier; __DEBUG_PRINT(("tid %d barrier2\n", __selftid)); v_next_and_wait(); setup_barrier_sync(barrier->barrier); __sync_fetch_and_add(&(barrier->barrier->num), 1); __DEBUG_PRINT(("tid %d barrier3\n", __selftid)); __mvspace_pull(); if(barrier->barrier->total == barrier->barrier->num) { int i; for(i=0;i<MAXTHREADS;i++) { if(__threadpool[i].barrier == barrier->barrier) __threadpool[i].state = E_NORMAL; } __DEBUG_PRINT(("tid %d barrier3.5\n", __selftid)); barrier->barrier->inited = 0; post_sem(barrier->barrier->sema, 0); } __DEBUG_PRINT(("tid %d barrier4\n", __selftid)); wait_sem(barrier->barrier->sema, 0); __DEBUG_PRINT(("tid %d barrier5\n", __selftid)); post_sem(barrier->barrier->sema, 0); __threadpool[__selftid].barrier = NULL; __threadpool[__selftid].state = E_NORMAL; leave_sync(); return 0; } return -1; }
void *hackbench_thread(void *t) { unsigned int i, num_groups, total_children; int readyfds[2], wakefds[2]; char dummy; num_groups = 50; t = NULL; fdpair(readyfds); fdpair(wakefds); while (1) { total_children = 0; for (i = 0; i < num_groups; i++) total_children += group(readyfds[1], wakefds[0]); /* Wait for everyone to be ready */ for (i = 0; i < total_children; i++) if (Read(readyfds[0], &dummy, 1) != 1) barf("Reading for readyfds"); /* Kick them off */ if (write(wakefds[1], &dummy, 1) != 1) barf("Writing to start them"); /* Reap them all */ for (i = 0; i < total_children; i++) { int status; wait(&status); if (!WIFEXITED(status)) exit(1); } if (!trywait_sem(&hackthread.sem.stop)) break; } post_sem(&hackthread.sem.complete); return NULL; }