pyt*_*nic 7 c linux multithreading gcc pthreads
为了理解pthread条件变量的代码,我编写了自己的版本.它看起来是否正确?我在一个程序中使用它,它的工作,但工作速度惊人得多.最初程序大约需要2.5秒,使用我的条件变量版本只需0.8秒,程序输出也是正确的.但是,我不确定,如果我的实施是正确的.
struct cond_node_t
{
sem_t s;
cond_node_t * next;
};
struct cond_t
{
cond_node_t * q; // Linked List
pthread_mutex_t qm; // Lock for the Linked List
};
int my_pthread_cond_init( cond_t * cond )
{
cond->q = NULL;
pthread_mutex_init( &(cond->qm), NULL );
}
int my_pthread_cond_wait( cond_t* cond, pthread_mutex_t* mutex )
{
cond_node_t * self;
pthread_mutex_lock(&(cond->qm));
self = (cond_node_t*)calloc( 1, sizeof(cond_node_t) );
self->next = cond->q;
cond->q = self;
sem_init( &self->s, 0, 0 );
pthread_mutex_unlock(&(cond->qm));
pthread_mutex_unlock(mutex);
sem_wait( &self->s );
free( self ); // Free the node
pthread_mutex_lock(mutex);
}
int my_pthread_cond_signal( cond_t * cond )
{
pthread_mutex_lock(&(cond->qm));
if (cond->q != NULL)
{
sem_post(&(cond->q->s));
cond->q = cond->q->next;
}
pthread_mutex_unlock(&(cond->qm));
}
int my_pthread_cond_broadcast( cond_t * cond )
{
pthread_mutex_lock(&(cond->qm));
while ( cond->q != NULL)
{
sem_post( &(cond->q->s) );
cond->q = cond->q->next;
}
pthread_mutex_unlock(&(cond->qm));
}
Run Code Online (Sandbox Code Playgroud)
您似乎不尊重此要求:
这些函数自动释放互斥体并导致调用线程在条件变量 cond 上阻塞;原子地在这里意味着“原子地相对于另一个线程访问互斥体然后访问条件变量”。也就是说,如果另一个线程能够在即将阻塞的线程释放互斥锁后获取该互斥锁,则该线程中对 pthread_cond_broadcast() 或 pthread_cond_signal() 的后续调用的行为应如同在即将阻塞的线程之后发出一样。 to-block 线程已被阻塞。
您解锁然后等待。另一个线程可以在这些操作之间做很多事情。
PS我不确定自己是否正确解释了这一段,请随时指出我的错误。
除了缺少返回值检查之外,还有一些应该可以修复的问题:
sem_destroy 不叫。cond_node_t在唤醒目标线程后接触,可能导致释放后使用。进一步评论:
pthread_cond_timedwait超时所需)可能会导致复杂化。基本上你的策略看起来不错,但是你有一个主要危险,一些未定义的行为,以及一个挑剔的问题:
sem_wait是它是可中断的,因此在重负载或运气不好的情况下,您的线程将被虚假唤醒。你必须仔细捕捉所有这些mallocor的返回值calloc编辑:实际上,你根本不需要malloc/ free。局部变量也可以。
| 归档时间: |
|
| 查看次数: |
7170 次 |
| 最近记录: |