带有互斥量的 Pthreads 程序 - 每次都打印相同的字符串
Pthreads program with mutex - printing same string every time
我有一个学校项目要求我编写一个程序来打印这个:<ONE><TWO><THREE><ONE><TWO><THREE><ONE><TWO><THREE>…..............
使用 3 个线程和互斥锁。我试图在 class 的帮助下完成它,但它只是保持只打印 <ONE>
。你能帮我解决我的问题并了解我做错了什么吗?
#include <pthread.h>
#include <stdio.h>
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *func(void *arg)
{
pthread_mutex_lock(&mutex);
while (1) {
printf ("<ONE>");
}
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void *func2(void *arg)
{
pthread_mutex_lock(&mutex);
while (1) {
printf ("<TWO>");
}
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void *func3(void *arg)
{
pthread_mutex_lock(&mutex);
while (1) {
printf ("<THREE>");
}
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
main()
{
pthread_t mythread1,mythread2,mythread3;
pthread_create( &mythread1, NULL, func, (void *) 1);
pthread_create( &mythread2, NULL, func2, (void *) 2);
pthread_create( &mythread3, NULL, func3, (void *) 3);
pthread_join ( mythread1, NULL);
pthread_join ( mythread2, NULL);
pthread_join ( mythread3, NULL);
exit(0);
}
正如我在评论中明确指出的那样,这将陷入无限循环,因为您在循环外进行锁定和解锁。第一步是将它们移到里面。
void *func(void *arg)
{
while (1) {
pthread_mutex_lock(&mutex);
printf ("<ONE>");
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
接下来,我们需要添加同步。一个简单的方法是声明一个全局变量:
int next = 1;
然后我们修改函数如下:
void *func(void *arg)
{
while (1) {
while(1) {
pthread_mutex_lock(&mutex);
if(next == 1) break;
pthread_mutex_unlock(&mutex);
}
printf ("<ONE>");
next = 2;
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
在func2
和func3
中,您需要将if(next == 1)
和next = 2
修改为合适的值。 func2
应该有 2 和 3 而 func3
应该有 3 和 1。
这种方法称为忙等待,通常不是最佳选择,因为它 cpu 非常紧张。更好的选择是查看 pthread_cond_wait()
。您可以在这里阅读:http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_cond_wait.html
我有一个学校项目要求我编写一个程序来打印这个:<ONE><TWO><THREE><ONE><TWO><THREE><ONE><TWO><THREE>…..............
使用 3 个线程和互斥锁。我试图在 class 的帮助下完成它,但它只是保持只打印 <ONE>
。你能帮我解决我的问题并了解我做错了什么吗?
#include <pthread.h>
#include <stdio.h>
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *func(void *arg)
{
pthread_mutex_lock(&mutex);
while (1) {
printf ("<ONE>");
}
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void *func2(void *arg)
{
pthread_mutex_lock(&mutex);
while (1) {
printf ("<TWO>");
}
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void *func3(void *arg)
{
pthread_mutex_lock(&mutex);
while (1) {
printf ("<THREE>");
}
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
main()
{
pthread_t mythread1,mythread2,mythread3;
pthread_create( &mythread1, NULL, func, (void *) 1);
pthread_create( &mythread2, NULL, func2, (void *) 2);
pthread_create( &mythread3, NULL, func3, (void *) 3);
pthread_join ( mythread1, NULL);
pthread_join ( mythread2, NULL);
pthread_join ( mythread3, NULL);
exit(0);
}
正如我在评论中明确指出的那样,这将陷入无限循环,因为您在循环外进行锁定和解锁。第一步是将它们移到里面。
void *func(void *arg)
{
while (1) {
pthread_mutex_lock(&mutex);
printf ("<ONE>");
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
接下来,我们需要添加同步。一个简单的方法是声明一个全局变量:
int next = 1;
然后我们修改函数如下:
void *func(void *arg)
{
while (1) {
while(1) {
pthread_mutex_lock(&mutex);
if(next == 1) break;
pthread_mutex_unlock(&mutex);
}
printf ("<ONE>");
next = 2;
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
在func2
和func3
中,您需要将if(next == 1)
和next = 2
修改为合适的值。 func2
应该有 2 和 3 而 func3
应该有 3 和 1。
这种方法称为忙等待,通常不是最佳选择,因为它 cpu 非常紧张。更好的选择是查看 pthread_cond_wait()
。您可以在这里阅读:http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_cond_wait.html