使用条件变量进行异步执行。

Using Condition Variables for Asynchronous Execution.

所以我正在使用 Pthreads 和 Ncurses 创建一个无人机模拟,我可以让我的代码同步地为任意数量的线程完美工作,只需使用 Mutex 来序列化我的屏幕更新。但是我想创建一个异步模拟。现在我正在尝试使用 POSIX condvar。这个想法是在运动时同步线程。所以说我想在 x 方向的 10 个位置移动 10 个线程。我想让Thread1在X方向移动一个单位,然后给Thread2在x方向移动的能力等等。这只是我处理 pthreads 的创建和尝试同步的代码:

int init_threads()
{
int rc = 0; int i = 0; long t = 0;
pthread_t threads[NUM_THREADS];

pthread_mutex_init(&mutex_lock, NULL);
pthread_cond_init(&count_threshold_cv, NULL); 

for(i; i < 2; i++) 
{
    rc = pthread_create(&threads[i], NULL, DCAS, (void *)t); 
    if(rc)
    {
        printf("Error return from create is %d\n", rc); 
        return -1; 
    }
}       
pthread_exit(NULL); 
}


void * DCAS(void * PID)
{
Tuple win = find_window(); 
int start_x = win.a/2; int start_y = win.b/2; 

pthread_mutex_lock(&mutex_lock); 
while(start_x != 10)
{
    pthread_cond_wait(&count_threshold_cv, &mutex_lock); 
}

update_screen(); 

pthread_mutex_unlock(&mutex_lock); 
}

void update_screen()
{
Tuple win = find_window(); 
int start_x = win.a/2; int start_y = win.b/2; 

pthread_mutex_lock(&mutex_lock); 

mvwaddch(local_win, start_x, start_y, 'o'); 
init_base_layouts(); 
wrefresh(local_win); 
sleep(1); 
start_x--; 

pthread_cond_signal(&count_threshold_cv); 
pthread_mutex_lock(&mutex_lock); 

}

它正在创建两个 pthread 并尝试在一个线程移动时向 cond-var 发出信号,以允许另一个线程能够在相同的 x 方向上移动 10 个 x 位置。但是,我似乎无法获得表明线程已移动的条件。非常感谢!

如果您等待一个条件变量,您必须等待某个共享状态上的某个特定条件发生变化(这就是它被称为条件变量的原因)。

但是,您正在等待的条件 (while (start_x != 10)) 没有超过共享状态:start_x 是每个线程的局部变量,不共享。

不清楚您要等待的确切状态:但是,如果您希望每个线程移动一次,然后在所有其他线程都有机会移动之前不再移动,那么 pthread barrier 可能是合适的原语。

在主函数中,创建线程之前:

pthread_barrier_init(&barrier, NULL, NUM_THREADS);

(其中 NUM_THREADS 是要创建的移动线程数)。然后在每个移动线程中:

for (i = 0; i < 10; i++)
{
    move();
    pthread_barrier_wait(&barrier);
}

然后所有线程将移动一次(以未指定的顺序),然​​后直到所有其他线程也移动后才继续。