【发布时间】:2019-12-19 07:13:03
【问题描述】:
您好,我对互斥锁锁定感到困惑。我对有经验的人有一个关于多线程的问题。例如,在我的代码中,我有一个包含互斥锁和条件变量的类,我将它们用于套接字通信。我使用mutex.lock()for 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”。
【问题讨论】:
-
它锁定互斥体,互斥体与任何其他变量没有关系
标签: c++ multithreading locking std mutex