因此,我正在使用 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 屏障可能是适当的基元。
在主函数中,线程创建之前:
pthread_barrier_init(&barrier, NULL, NUM_THREADS);
(其中 NUM_THREADS
是要创建的移动线程数)。然后在每个移动线程中:
for (i = 0; i < 10; i++)
{
move();
pthread_barrier_wait(&barrier);
}
然后所有线程将移动一次(以未指定的顺序),然后直到所有其他线程也移动后才继续。
关于c - 使用条件变量进行异步执行。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33005624/