带有互斥量的 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);
}

func2func3中,您需要将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