首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >互斥锁混淆

互斥锁混淆
EN

Stack Overflow用户
提问于 2019-12-19 07:13:03
回答 3查看 559关注 0票数 0

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

我的接收数据功能

代码语言:javascript
复制
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--;

}

我的发送数据功能

代码语言:javascript
复制
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”。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-19 07:22:01

互斥是一次只有一个线程可以拥有的东西。如果没有线程接触到一个特定的变量,除非它有一个特定的互斥体,那么我们就说互斥锁这个东西。

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

一般来说,除非你别无选择,否则当你拿着互斥的时候,你不想做任何“沉重”的事情。特别是,打电话给sleep_for尤其愚蠢和糟糕。recv也是。

票数 1
EN

Stack Overflow用户

发布于 2019-12-19 15:43:53

我是锁定了函数的变量还是其他的东西。

要非常清楚的是:如果线程A保持一些互斥锁M,这不会阻止其他线程做任何事情,除了同时锁定同一个互斥M之外。

如果有人说"Mutex M保护变量x、y和z“,那只是表示程序经过仔细编写之后,每个线程总是在访问这些变量之前锁定互斥量M的一种简写方式。

这里的其他答案会更详细.

票数 1
EN

Stack Overflow用户

发布于 2019-12-19 08:15:57

来自优先选择

The mutex class is a synchronization primitive that can be used to protect shared data from being simultaneously accessed by multiple threads.

顾名思义,互斥是一个互斥状态保持器,它可以以原子方式暴露线程之间的单个状态(锁状态)。锁定是通过不同的机制实现的,如unique_lock、shared_lock等。

另一个问题是:您的代码有几个问题:

  1. Recv_data函数(分配)中的前两行将在函数返回后泄漏。看看雷伊如何在现代c++中初始化和分配
  2. 因为您使用的是线程锁和互斥锁,所以不需要条件变量。互斥将保证线程的互斥,并且不需要通知。然而,这在很大程度上取决于您生成线程的方式。
  3. 您正在混合两个概念,套接字通信和线程。这看起来有点可疑。也就是说,还不清楚您的函数是从哪个上下文中调用的(不同的过程?在这种情况下,谈论线程是没有意义的。

我建议您简化发送和接收单个变量(而不是数组)的代码,以便先了解基本知识,然后再转到更复杂的用例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59404850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档