你好,我对互斥锁感到困惑。对于有经验的人,我有一个关于多线程的问题。例如,在我的代码中,我有包含互斥和条件变量的类,我将这些类用于套接字通信。我将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就会被阻塞,比如stdin和stdout”。
发布于 2019-12-19 07:22:01
互斥是一次只有一个线程可以拥有的东西。如果没有线程接触到一个特定的变量,除非它有一个特定的互斥体,那么我们就说互斥锁这个东西。
多个线程通常用于防止多个线程同时接触某物。程序员有责任将特定的互斥与特定的共享资源相关联,确保除了持有适用互斥的线程之外,共享资源不会被查看或触摸。
一般来说,除非你别无选择,否则当你拿着互斥的时候,你不想做任何“沉重”的事情。特别是,打电话给sleep_for尤其愚蠢和糟糕。recv也是。
发布于 2019-12-19 15:43:53
我是锁定了函数的变量还是其他的东西。
要非常清楚的是:如果线程A保持一些互斥锁M,这不会阻止其他线程做任何事情,除了同时锁定同一个互斥M之外。
如果有人说"Mutex M保护变量x、y和z“,那只是表示程序经过仔细编写之后,每个线程总是在访问这些变量之前锁定互斥量M的一种简写方式。
这里的其他答案会更详细.
发布于 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等。
另一个问题是:您的代码有几个问题:
我建议您简化发送和接收单个变量(而不是数组)的代码,以便先了解基本知识,然后再转到更复杂的用例。
https://stackoverflow.com/questions/59404850
复制相似问题