Edw*_*ard 2 c multithreading mutex pthreads condition-variable
假设我有一个带有3个POSIX线程的C程序,共享一个全局变量,互斥量和条件变量,其中两个执行以下的伪代码:
...process data...
pthread_mutex_lock( &mutex );
variable = data_ptr;
pthread_cond_signal( &cond );
pthread_mutex_unlock( &mutex );
Run Code Online (Sandbox Code Playgroud)
第三次运行:
while(1) {
while( variable == NULL ) {
pthread_mutex_wait( &cond, &mutex );
}
printf( "Data is %d", *variable );
}
Run Code Online (Sandbox Code Playgroud)
假设第三个线程将看到前两个中的每一个的数据是否安全?
换句话说,如果一个线程在互斥锁和一个条件变量上作用,是否可以安全地假设它是下一个获取锁定的,如果它被发出信号,而不是某个其他线程可能正在等待锁?
bdo*_*lan 12
没有pthread_mutex_wait这样的东西.我猜你的意思是:
pthread_mutex_lock(&mutex);
/* ... */
while (1) {
while (variable == NULL)
pthread_cond_wait(&cond, &mutex);
printf("Data is %d", *variable);
}
/* ... */
pthread_mutex_unlock(&mutex);
Run Code Online (Sandbox Code Playgroud)
没有保证第三个线程会看到两者的数据.pthread_cond_signal将唤醒第三个线程,但它可能不会立即获取互斥锁.其他作家之一可能首先使用互斥锁.但是你可以用更多的工作来实现你想要的东西:
void put(int *p) {
pthread_mutex_lock(&mutex);
while (variable)
pthread_cond_wait(&cond_empty, &mutex);
variable = p;
pthread_cond_signal(&cond_full);
pthread_mutex_unlock(&mutex);
}
int *get() {
int *ret;
pthread_mutex_lock(&mutex);
while (!variable)
pthread_cond_wait(&cond_full, &mutex);
ret = variable;
variable = NULL;
pthread_cond_signal(&cond_empty);
pthread_mutex_unlock(&mutex);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
通过显式等待读取变量,我们避免了潜在的竞争条件.
| 归档时间: |
|
| 查看次数: |
1753 次 |
| 最近记录: |