【发布时间】:2015-11-15 03:18:41
【问题描述】:
好吧,下面的代码是针对两个线程的。我对互斥锁有一些问题。 创建线程 t1 后,它调用 add_queue()。然后它会通知线程 t2 在其临界区工作。但是,该程序不会为线程 t2 运行。 线程 t1 运行并在其临界区完成工作。然后,我锁定了线程 t2 的互斥锁。但是,程序卡在第 29 行。
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
static int pending_requests =0;
static pthread_mutex_t prmutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t prcondition = PTHREAD_COND_INITIALIZER;
static int critical = 0;
int get_number_requests(void)
{
return pending_requests;
}
void add_queue()
{
pthread_mutex_lock(&prmutex);
pending_requests++;
critical++;
pthread_mutex_unlock(&prmutex);
printf("xxxx\n");
printf("critical=%d\n",critical);
}
void remove_from_queue()
{
pthread_mutex_lock(&prmutex);
pending_requests--;
printf("BBBBcritical=%d\n",critical);
critical--;
printf("BBBcritical=%d\n",critical);
pthread_mutex_unlock(&prmutex);
}
void *get_request()
{
add_queue();
if (get_number_requests() != 0)
{
printf("I have a element in the queue. Signalling to processor thread..\n");
pthread_cond_signal(&prcondition);
}
pthread_exit(0);
}
void *processor()
{
while(get_number_requests() == 0)
{
printf("BBB This is a processor thread, I am waiting..\n");
pthread_cond_wait(&prcondition,&prmutex);
}
while(get_number_requests() !=0)
{
printf("aaaa\n");
remove_from_queue();
pthread_cond_signal(&prcondition);
}
pthread_exit(0);
}
int main()
{
pthread_t t1,t2;
printf("critical=%d\n",critical);
pthread_create(&t1,NULL,get_request,NULL);
pthread_create(&t2,NULL,processor,NULL);
printf("critical=%d\n",critical);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
}
【问题讨论】:
标签: linux operating-system pthreads