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

时间:2015-10-08 02:31:56

标签: c multithreading asynchronous pthreads mutex

所以我用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个位置。我似乎无法获得表明线程已移动的条件。非常感谢先进!

1 个答案:

答案 0 :(得分:2)

如果等待一个条件变量,你必须等待某个共享状态的特定条件才能改变(这就是为什么它被称为条件变量)。

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

目前还不清楚你想要等待的状态:但是,如果你想要的是每个线程移动一次然后再移动直到所有其他线程都有机会移动,那么pthread屏障可能是适当的原语。

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

pthread_barrier_init(&barrier, NULL, NUM_THREADS);

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

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

然后所有线程将移动一次(以未指定的顺序),然​​后在所有其他线程移动之前不再继续。