【发布时间】:2011-10-27 10:05:12
【问题描述】:
我的意图是让 send() 在全局计数器为奇数时忽略信号,并在偶数时广播。然后有 2 个 recv() 线程,等待信号。在信号的情况下,只有一个 recv() 线程可以接收它;在广播的情况下,双方都可以收到。
但我的结果显示两个 recv() 都收到了相同的奇数,这不应该发生。
我的代码中的全局计数器和信号是否紧密耦合?
编辑:
我想我得到了这个问题的答案。 recv() 线程收到信号后,会再次尝试锁定与条件变量关联的互斥锁,但可能需要等待,因为互斥锁可能已经被其他线程锁定。在等待期间,全局计数可能会发生变化,因此它最终打印的全局计数与收到信号时的不同。
另外,在我的代码中,即使 send() 发送广播,多个 recv() 线程实际上也不能同时处理信号,因为它们仍然是互斥的,因为它们共享同一个互斥锁
编辑结束
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int n = 0;
int count = 0;
void* recv(void *name)
{
while(1)
{
pthread_mutex_lock(&mutex);
// wait for signal
pthread_cond_wait(&cond, &mutex);
count++;
if(count > 10)
{
printf("number %d terminate %s\n", n, (char*)name);
}
else
{
printf("%s gets number:%d\n", (char*)name, n);
}
pthread_mutex_unlock(&mutex);
if(count > 10)
{
return (NULL);
}
}
}
void* send(void *ptr)
{
while(1)
{
pthread_mutex_lock(&mutex);
n++;
// odd: signal
// even: broadcast
if(n%2)
pthread_cond_signal(&cond);
else
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
}
}
int main(int argc, char *argv[])
{
pthread_t t1, t2, t3;
char *name1 = "t1";
char *name2 = "t2";
pthread_create(&t1, NULL, recv, (void *) name1);
pthread_create(&t2, NULL, recv, (void *) name2);
pthread_create(&t3, NULL, send, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_cancel(t3);
return 0;
}
输出,注意前两行:
t2 gets number:12493
t1 gets number:12493
t1 gets number:12534
t2 gets number:12534
t1 gets number:12623
t1 gets number:12624
t2 gets number:12666
t1 gets number:12666
t2 gets number:12713
t1 gets number:12713
number 12770 terminate t2
number 12998 terminate t1
【问题讨论】:
标签: c synchronization pthreads