我有一个函数由thread1,2,3,4执行....一旦thread1访问该函数,我使用thread_cond来等待其他线程。一旦thread1完成它的工作,我将thread_signal发送到同一个cond。 Thread2正在执行该功能。但在完成执行后,其他线程无法访问该功能。
请帮帮我
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
int limit = 0;
pthread_mutex_t mutex[100];
pthread_cond_t cond[100];
pthread_t tid[100];
void *enter()
{
if (limit == 1)
{
printf("waiting\n");
pthread_cond_wait(&cond[1],&mutex[1]);
}
gotofunction();
}
void gotofunction()
{
limit++;
/* Do work */
printf("Doing work\n");
sleep(1);
limit--;
printf("Going to give signal\n");
pthread_cond_signal(&cond[1]);
}
int main()
{
int n,i;
scanf("%d",&n);
for (i=0;i<100;i++)
{
pthread_mutex_init(&mutex[i], NULL);
pthread_cond_init(&cond[i], NULL);
}
for (i=0;i<n;i++)
{
pthread_create(&tid[i], NULL, enter, NULL);
sleep(0.5);
}
for (i=1;i<=n;i++)
{
pthread_join(tid[i], NULL);
}
}
基本上,thread1打印&#34;做工作&#34; Thread2打印&#34;做工作&#34; 然后其他线程没有任何反应
答案 0 :(得分:0)
在调用时,必须将传递给pthread_cond_wait()
的互斥锁锁定。在检查并更改条件变量与之配对的条件时,也必须锁定该互斥锁(在这种情况下,limit == 1
就是那个条件)。
您还应该使用模式while (condition) { pthread_cond_wait() }
(而不是if (condition)
),因为条件变量可能会在条件实际为真的情况下被唤醒。
更改代码以锁定访问limit
周围的互斥锁,并在模拟工作时将其解锁,如下所示:
void *enter()
{
pthread_mutex_lock(&mutex[1]);
while (limit == 1)
{
printf("waiting\n");
pthread_cond_wait(&cond[1],&mutex[1]);
}
gotofunction();
pthread_mutex_unlock(&mutex[1]);
return NULL;
}
void gotofunction()
{
limit++;
pthread_mutex_unlock(&mutex[1]);
/* Do work */
printf("Doing work\n");
sleep(1);
pthread_mutex_lock(&mutex[1]);
limit--;
printf("Going to give signal\n");
pthread_cond_signal(&cond[1]);
}
当然,当您检查限制为1时,您可以使用普通的互斥体 - 但是可以通过将条件更改为while (limit >= N)
来扩展此方案以允许N个线程同时执行工作。 / p>