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