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

标签 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 个 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/

相关文章:

javascript - document.ready 和 async 有什么区别?

c - read() 和 write() 函数不协作

python - 多线程Linux工具命令?

python - 高效的python raw_input和串口轮询

ios - 确定是否在 `touch` 回调线程上,ios

c# - 取消等待中的任务

c# - 是否有可能有一个 .net Remoting 组件,其中每一端都使用不同版本的框架?

c - 将结构体指针添加到结构体指针的末尾

c - fgets - 数组与指针之间的区别

c++ - 没有ALU的ARM需要多少运算量