c++ - 互斥锁困惑

标签 c++ multithreading locking std mutex

您好,我对互斥锁定感到困惑。我对有经验的人有一个关于多线程的问题。例如,在我的代码中,我有一个包含互斥锁和条件变量的类,我将它们用于套接字通信。我使用 mutex.lock() 来锁定函数的变量,但我不明白我锁定了什么。我是否锁定了函数的变量或其他东西。 我使用 unique_lock 因为我想使用 condition_variable 并锁定函数的变量,但我不知道它是否有效。我想创建相互等待的发送者和接收者。

我的接收数据函数

void connect_tcp::Recv_data(SOCKET s,mms_response &response,Signals *signals,bool &ok,ıvır_zıvır &ıvır) {
    LinkedList** list = new LinkedList * [1000];
    uint8_t* buffer = new uint8_t [10000];
    //ok = false;
    unique_lock <mutex> lck(ıvır.mutex);
    if (ıvır.for_data == true) {
        dataready = true;
    }
    ıvır.cv.wait(lck, [] {return dataready; });
    this_thread::sleep_for(1s);
    recv(s, (char*)buffer, 10000, 0);
    dataready = false;
    decode_bytes(response,buffer, list,signals);
    ok = true;
    ıvır.ıvır_control--;

}

我的发送数据函数

int connect_tcp::send_data(SOCKET s, mms_response &response,LinkedList** list,int &j,bool &ok, ıvır_zıvır& ıvır) {
    /*this_thread::sleep_for(0.3s);*/
    int i = 0;
    int k = 0;
    ıvır.mutex.lock();
    uint8_t* buffer = new uint8_t[10000];
    while (i<j)
    {
        for (auto it = list[i]->data.begin(); it != list[i]->data.end(); it++)
        {
            buffer[k]=*it;
            k++;

        }
        i++;

    }

    int jk = 0;

        jk= send(s, (const char*)buffer, list[0]->size, 0);
        cout << jk << " Bytes sent" << endl;

        dataready = true;
        this_thread::sleep_for(1s);
        ıvır.mutex.unlock();
        ıvır.cv.notify_one();

    if (jk == -1) {
        exit(-1);
    }
    i = 0;
    while (i<j) {
        delete list[i]; 
        i++;
    }
    j = 1;
    return jk;
}

我读了很多书和条目,但没有人解释 mutex.lock() 什么是锁定。我只看到一个解释是“如果 2 个线程想要使用相同的源 mutex.lock 被阻止,例如 stdinstdout”。

最佳答案

互斥体是一种在同一时间只能有一个线程拥有的东西。如果没有线程接触特定变量,除非它有特定的互斥锁,那么我们说互斥锁锁定了那个东西。

互斥体通常用于防止多个线程同时接触某物。由程序员将特定互斥体与特定共享资源相关联,方法是确保除了持有适用互斥体的线程外,共享资源不会被查看或触及。

一般来说,除非别无选择,否则您不想在持有互斥量的同时做任何“繁重”的事情。特别是,调用 sleep_for 是特别愚蠢和糟糕的。 recv 也是如此。

关于c++ - 互斥锁困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59404850/

相关文章:

c++ - Lua 5.2 重定向打印函数

c++ - 错误 : variable '*' has initializer but incomplete type and one other

基于 Java 的线程池 : How to test performance?

python - 仅锁定 Python 中的一部分威胁

c++ - 删除继承中的内存

c++ - 使用迭代器向 vector 插入元素没有效果

multithreading - 如何在多线程应用程序中保护和访问嵌套对象

c# - System.Timers.Timer 非常不准确

php - 如果事务未关闭,Neo4j 数据库将被锁定

mysql - 在以下情况下是否需要表锁来保持数据完整性