gpt4 book ai didi

c - 使用互斥锁实现生产者/消费者

转载 作者:太空宇宙 更新时间:2023-11-04 01:42:19 31 4
gpt4 key购买 nike

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#define WORK_SIZE 1024
pthread_mutex_t work_mutex;
char work_area[WORK_SIZE];
void *thread_start(void *);
int main() {
pthread_t a_thread;
pthread_mutex_init(&work_mutex,NULL);
pthread_create(&a_thread,NULL,thread_start,NULL);
while(1)
{
pthread_mutex_lock(&work_mutex);
printf("Enter some text\n");
fgets(work_area, WORK_SIZE, stdin);
pthread_mutex_unlock(&work_mutex);
}
return 0;
}

void *thread_start(void *arg)
{
sleep(1);
while(1)
{
pthread_mutex_lock(&work_mutex);
printf("You enetered %d char",strlen(work_area));
pthread_mutex_unlock(&work_mutex);
}
}

当我执行程序时,在主线程中释放互斥锁后,它每次都会再次获取锁,然后第二个线程才能获取锁。我期望一旦主线程释放锁,已经被阻塞的第二个线程将获得锁并在主线程之前开始执行。

更清楚地说,我得到了这种类型的输出:-

Enter some text
qwerty
Enter some text
asdaf
Enter some text
jkdf
Enter some text

最佳答案

在你看来就是这样。您在 main 中进行数据输入之前锁定,这将比输出该行所需的数据大几个数量级。在那段时间里,另一个线程只会阻塞。您的 main 将释放锁,几微秒后再次获取它。

如果您这样做的时间足够长(可能数千次),您就会发现它有效。但是最好将 main 中的输入行复制到队列或其他一些受锁保护的内存中。然后另一个线程就有机会获取它。

编辑:

大意是这样的。我的代码添加很糟糕,但应该足以说明。

int main()
{
pthread_t a_thread;
pthread_mutex_init(&work_mutex, NULL);
pthread_create(&a_thread, NULL, thread_start, NULL);

memset(work_area, '\0', sizeof(work_area));


char input[WORK_SIZE - 1];

while (1)
{
printf("Enter some text\n");
fgets(input, WORK_SIZE, stdin);

pthread_mutex_lock(&work_mutex);
strcpy(work_area, input);
pthread_mutex_unlock(&work_mutex);
}

return 0;
}

void *thread_start(void *arg)
{
sleep(1);

while (1)
{
pthread_mutex_lock(&work_mutex);

if (work_area[0] != '\0')
{
printf("You enetered %d char\n", strlen(work_area));
work_area[0] = '\0';
}

pthread_mutex_unlock(&work_mutex);
}
}

关于c - 使用互斥锁实现生产者/消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3212930/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com