我试图掌握对互斥锁的理解。我正在使用三个不同的线程(即加法,乘法和除法)求解数学方程(a+b) * (c+d) / e。首先,我已经编写了这段代码。我想到的是,添加线程应首先运行,而所有其他线程应被阻止,但它给出的是随机输出。这是我到目前为止编写的代码。

#include <iostream>
#include <pthread.h>

using std::cout, std::endl;

pthread_mutex_t mutex1;

void *Division(void *arg_div)
{
    int *input =(int *)arg_div;
    int result = input[0]/input[1];
    cout<<"Final result"<<endl;
    cout << result ;
    pthread_exit(NULL);
}

void *Multiplication(void *arg_mul)
{
    int *input =(int *)arg_mul;

    int arg1[2];
    arg1[0]=input[0]*input[1];
    arg1[1]=input[2];

    cout<<"Multiplication results are"<<endl;
    cout<<arg1[0];
    cout<<arg1[1];

    pthread_exit(NULL);
}

void *Addition(void *arg_add)
{
    pthread_mutex_lock(&mutex1);

    cout<<"Addition Thread is acquring lock"<<endl;

    int *input =(int *)arg_add;

    //my critical section
    int arg[3];
    arg[0]=input[0]+input[1];
    arg[1]=input[2]+input[3];

    pthread_mutex_unlock(&mutex1);

    arg[2]=input[4];

    cout<<"output of add function"<<endl;
    cout<<arg[0]<<endl;
    cout<<arg[1]<<endl;
    cout<<arg[2]<<endl;

    pthread_exit(NULL);
}

int main()
{
    int values[5]={6,5,4,3,2};

    pthread_t add;
    pthread_t multiply;
    pthread_t divide;

    pthread_create(&add,NULL,Addition,(void*)values);
    pthread_create(&multiply,NULL,Multiplication,(void*)values);
    pthread_create(&divide,NULL,Division,(void*)values);


    pthread_join(add,NULL);
    pthread_join(multiply,NULL);
    pthread_join(divide,NULL);


    return 0;
}

我只想先执行加法线程,然后执行乘法线程,然后再执行除法。

最佳答案

您的代码中有两个问题。

1)只有一个线程使用该锁。这不会影响任何其他线程,因此可以随时自由运行。

2)互斥锁是互斥的,不是执行顺序。如果您希望一个线程先于另一个线程运行,则必须安排某种方式来实现。例如,“线程2”可以在“线程1”已完成的条件下等待; “线程1”将适本地发出该信号。或者,您可以研究信号量使用的生产者/消费者模型:加法线程正在产生结果供乘法线程使用。

10-05 20:47
查看更多