diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/solvers/h48/thread.h | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/src/solvers/h48/thread.h b/src/solvers/h48/thread.h index 155bc6a..d035b52 100644 --- a/src/solvers/h48/thread.h +++ b/src/solvers/h48/thread.h | |||
| @@ -11,11 +11,11 @@ typedef struct | |||
| 11 | int front; | 11 | int front; |
| 12 | int rear; | 12 | int rear; |
| 13 | int tasks_count; | 13 | int tasks_count; |
| 14 | int active; | 14 | atomic_int active; |
| 15 | pthread_mutex_t mutex; | 15 | pthread_mutex_t mutex; |
| 16 | pthread_cond_t cond; | 16 | pthread_cond_t cond; |
| 17 | pthread_cond_t active_cond; | 17 | pthread_cond_t active_cond; |
| 18 | bool terminate; | 18 | atomic_bool terminate; |
| 19 | } task_queue_t; | 19 | } task_queue_t; |
| 20 | 20 | ||
| 21 | STATIC void solve_h48_appendsolution_thread(dfsarg_solveh48_t *, task_queue_t *); | 21 | STATIC void solve_h48_appendsolution_thread(dfsarg_solveh48_t *, task_queue_t *); |
| @@ -62,6 +62,7 @@ init_queue(task_queue_t *queue) | |||
| 62 | queue->rear = 0; | 62 | queue->rear = 0; |
| 63 | queue->tasks_count = 0; | 63 | queue->tasks_count = 0; |
| 64 | queue->active = 0; | 64 | queue->active = 0; |
| 65 | queue->terminate = ATOMIC_VAR_INIT(false); | ||
| 65 | pthread_mutex_init(&queue->mutex, NULL); | 66 | pthread_mutex_init(&queue->mutex, NULL); |
| 66 | pthread_cond_init(&queue->cond, NULL); | 67 | pthread_cond_init(&queue->cond, NULL); |
| 67 | pthread_cond_init(&queue->active_cond, NULL); | 68 | pthread_cond_init(&queue->active_cond, NULL); |
| @@ -93,7 +94,7 @@ copy_queue(task_queue_t *src, task_queue_t *dest, int depth, int64_t *nsols) | |||
| 93 | dest->front = src->front; | 94 | dest->front = src->front; |
| 94 | dest->rear = src->rear; | 95 | dest->rear = src->rear; |
| 95 | dest->tasks_count = src->tasks_count; | 96 | dest->tasks_count = src->tasks_count; |
| 96 | dest->active = src->active; | 97 | // atomic_init(&dest->active, &src->active); |
| 97 | pthread_cond_broadcast(&dest->cond); | 98 | pthread_cond_broadcast(&dest->cond); |
| 98 | pthread_mutex_unlock(&dest->mutex); | 99 | pthread_mutex_unlock(&dest->mutex); |
| 99 | } | 100 | } |
| @@ -121,14 +122,12 @@ start_thread(void *arg) | |||
| 121 | pthread_mutex_unlock(&queue->mutex); | 122 | pthread_mutex_unlock(&queue->mutex); |
| 122 | 123 | ||
| 123 | solve_h48_single(task, queue); | 124 | solve_h48_single(task, queue); |
| 124 | 125 | ||
| 125 | pthread_mutex_lock(&queue->mutex); | 126 | atomic_fetch_sub(&queue->active, 1); |
| 126 | queue->active--; | ||
| 127 | 127 | ||
| 128 | if(queue->tasks_count == 0 && queue->active == 0) | 128 | if(queue->tasks_count == 0 && queue->active == 0) |
| 129 | pthread_cond_signal(&queue->active_cond); | 129 | pthread_cond_signal(&queue->active_cond); |
| 130 | } | 130 | } |
| 131 | pthread_mutex_unlock(&queue->mutex); | ||
| 132 | } | 131 | } |
| 133 | return NULL; | 132 | return NULL; |
| 134 | } | 133 | } |
| @@ -247,7 +246,7 @@ solve_h48_parent( | |||
| 247 | const void *data, | 246 | const void *data, |
| 248 | char *solutions) | 247 | char *solutions) |
| 249 | { | 248 | { |
| 250 | int64_t nsols; | 249 | int64_t nsols = 0; |
| 251 | int p_depth = 0; | 250 | int p_depth = 0; |
| 252 | dfsarg_solveh48_t bfs_arg; | 251 | dfsarg_solveh48_t bfs_arg; |
| 253 | tableinfo_t info; | 252 | tableinfo_t info; |
| @@ -296,14 +295,11 @@ solve_h48_parent( | |||
| 296 | pthread_mutex_unlock(&nq.mutex); | 295 | pthread_mutex_unlock(&nq.mutex); |
| 297 | } | 296 | } |
| 298 | 297 | ||
| 299 | pthread_mutex_lock(&nq.mutex); | 298 | atomic_store(&nq.terminate, true); |
| 300 | nq.terminate = true; | ||
| 301 | pthread_cond_broadcast(&nq.cond); | 299 | pthread_cond_broadcast(&nq.cond); |
| 302 | pthread_mutex_unlock(&nq.mutex); | ||
| 303 | 300 | ||
| 304 | for (int i = 0; i < THREADS; i++){ | 301 | for (int i = 0; i < THREADS; i++){ |
| 305 | pthread_join(threads[i], NULL); | 302 | pthread_join(threads[i], NULL); |
| 306 | } | 303 | } |
| 307 | // fix memory release for multiple scrambles. | ||
| 308 | return nsols; | 304 | return nsols; |
| 309 | } | 305 | } |
