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

标签 c multithreading pthreads posix mutex

#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/

相关文章:

c++ - 如何在 Linux 中跟踪 pthread 调度?

c - 我的书说制作一个程序,仅使用 switch 语句来跟踪高级用户欠公司的金额

c - Scanf 输入结转到下一个 scanf

c - OpenCL get_local_id() 永远不会返回 0?

java - Java中的静态方法和线程安全

.NET 单元测试框架,可以处理多个线程的测试

multithreading - pthreads 只能共享全局资源吗?

c - 如何将套接字控制传递给子进程?

c# - 我可以从后台线程更新 UI,为什么?

c - 对使用 -pthread 和 -lpthread 编译的 pthread_wait 的 undefined reference