Update threads.c

This commit is contained in:
blueloveTH 2025-11-24 23:46:30 +08:00
parent 558eb10854
commit 8a4338faf9

View File

@ -80,11 +80,11 @@ static c11_thrd_retval_t _thrdpool_worker(void* arg) {
while(true) { while(true) {
c11_cond__wait(p_worker->p_cond, p_worker->p_mutex); c11_cond__wait(p_worker->p_cond, p_worker->p_mutex);
int sync_val = atomic_load(&p_tasks->sync_val); int sync_val = atomic_load(&p_tasks->sync_val);
if(sync_val == 1) break;
if(sync_val == -1) { if(sync_val == -1) {
c11_mutex__unlock(p_worker->p_mutex); c11_mutex__unlock(p_worker->p_mutex);
return 0; // force kill return 0; // force kill
} }
if(sync_val == 1) break;
} }
c11_mutex__unlock(p_worker->p_mutex); c11_mutex__unlock(p_worker->p_mutex);
@ -99,6 +99,10 @@ static c11_thrd_retval_t _thrdpool_worker(void* arg) {
break; break;
} }
} }
while(atomic_load(&p_tasks->sync_val) == 0) {
c11_thrd__yield();
}
} }
return 0; return 0;
} }
@ -123,24 +127,23 @@ void c11_thrdpool__ctor(c11_thrdpool* pool, int length) {
} }
void c11_thrdpool__dtor(c11_thrdpool* pool) { void c11_thrdpool__dtor(c11_thrdpool* pool) {
c11_mutex__lock(&pool->workers_mutex);
atomic_store(&pool->tasks.sync_val, -1); atomic_store(&pool->tasks.sync_val, -1);
c11_cond__broadcast(&pool->workers_cond); c11_cond__broadcast(&pool->workers_cond);
c11_mutex__unlock(&pool->workers_mutex);
for(int i = 0; i < pool->length; i++) { for(int i = 0; i < pool->length; i++) {
c11_thrdpool_worker* p_worker = &pool->workers[i]; c11_thrdpool_worker* p_worker = &pool->workers[i];
c11_thrd__join(p_worker->thread); c11_thrd__join(p_worker->thread);
} }
PK_FREE(pool->workers);
c11_mutex__dtor(&pool->workers_mutex); c11_mutex__dtor(&pool->workers_mutex);
c11_cond__dtor(&pool->workers_cond); c11_cond__dtor(&pool->workers_cond);
PK_FREE(pool->workers);
} }
void c11_thrdpool__map(c11_thrdpool* pool, c11_thrdpool_func_t func, void** args, int num_tasks) { void c11_thrdpool__map(c11_thrdpool* pool, c11_thrdpool_func_t func, void** args, int num_tasks) {
if(num_tasks == 0) return; if(num_tasks == 0) return;
while(atomic_load(&pool->tasks.sync_val) != 0) {
c11_thrd__yield();
}
// assign tasks // assign tasks
c11_mutex__lock(&pool->workers_mutex); c11_mutex__lock(&pool->workers_mutex);
pool->tasks.func = func; pool->tasks.func = func;