我使用multi-threading
编写了代码,创建了两个threads
。
Consumer Thread
:来自dequeue
的{{1}}个元素。Circular Queue
:Producer Thread
中的enqueue
十个元素。 Circular Queue
在插入六个元素之前处于等待状态,仅在Consumer Thread
dequeue
中插入六个元素后才起作用Producer Thread
元素。以下是我的代码:< / p>
queue
代码在void *producer(void *t)
{
int i;
long my_id = (long)t;
for (i=0; i<10; i++)
{
pthread_mutex_lock(&count_mutex);
printf("\nInserting value = %d ",count);
enQueue(count);
displayQueue();
count++;
if (count == 6)
{
pthread_cond_signal(&count_threshold_cv);
printf("\nproducer: thread %ld, count = %d Threshold reached.\n",my_id, count);
}
printf("\nproducer: thread %ld, count = %d, unlocking mutex\n",my_id, count);
pthread_mutex_unlock(&count_mutex);
}
pthread_exit(NULL);
}
void *consumer(void *t)
{
long my_id = (long)t;
printf("Starting Consumer Thread(): thread %ld\n", my_id);
pthread_mutex_lock(&count_mutex);
while (count<6)
{
pthread_cond_wait(&count_threshold_cv, &count_mutex);
printf("\nconsumer: thread %ld Condition signal received.\n", my_id);
}
printf(" \nDeleted value =%d ",deQueue());
displayQueue();
printf("\nconsumer: thread %ld count now = %d.\n", my_id, count);
pthread_mutex_unlock(&count_mutex);
pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
int i, rc;
long t1=1, t2=2;
pthread_t threads[2];
//Threads Created
pthread_create(&threads[1], &attr, consumer, (void *)t1);
pthread_create(&threads[0], &attr, producer, (void *)t2);
//Thread Clean Up Followed
}
中按预期工作。
Windows(CodeBlocks)
中删除了一个元素。queue
。但是当在queue
中执行时,会插入First 0-9元素,然后从Ubuntu
中删除一个元素。
用于在queue
中编译的命令:ubuntu
。
这种不同行为的原因是什么以及如何解决这个问题?
对于整个代码Follow link
答案 0 :(得分:0)
这种不同行为的原因是什么
线程不会保证两个不同线程中的内容将以任何特定顺序发生,除非您明确同步以便它们执行。你没有同步,所以事情按某种顺序发生,然后它们以不同的顺序发生。这完全是预期的。
如果您希望事情以某种顺序发生,您必须明确地让两个线程彼此等待或不使用线程。
由于你的代码现在没有任何东西阻止“生产者”循环10次然后退出。
答案 1 :(得分:-1)
有些情况会在代码中创建死锁。作为一个例子,如果消费者&#39;线程在“生产者”之前开始。线程它创建死锁情况。消费者&#39;等待发出信号&#39; count_threshold_cv&#39;它已经获得了&#39; count_mutex&#39;互斥。制片人的平均时间&#39;正在等待获得&#39; count_mutex&#39;。因此,此死锁情况会导致应用程序挂起。请设计申请以避免这种情况。我们无法保证哪个线程首先启动。特别是获取互斥锁应仅适用于所需的代码段集。
编辑:因为&#39; pthread_cond_wait&#39;传递&#39; count_mutex&#39;这不会造成死锁。但由于我们无法保证线程执行的顺序,因此行为是不可预测的。 此外,你不能依靠cout out put。由于输出可能不是受让人的执行顺序。