我是C ++中的多线程新手。
我要先创建2个线程。所有线程都将等待直到它们得到一个集合为止。我正在使用互斥体数组(用于使线程等待)。等待后它们执行任务(提取数组)。它们将增加计数,以使主线程知道它们提取了数组。这样,在处理完所有三个数组之后,我希望线程打印其提取的数组的大小并退出。但是不幸的是我的代码没有被终止。我认为它陷入了僵局。
任何人都可以帮忙。
这是我的代码:
#include <bits/stdc++.h>
#include<thread>
#include <chrono>
#include<mutex>
#include<condition_variable>
int n=5;
int count=0;
std::vector<std::vector<std::string>> sets;
std::vector<std::vector<std::string>> x;
std::mutex m[2],as,p;
std::condition_variable cv,cb;
int y=0,rt[2]={0};
int flag[2][3]={0};
int u=0;
void see(int i)
{
//cout<<"hii";
int j=0;
while(j<3)
{
std::unique_lock<std::mutex> lk(m[i]);
std::cout<<"\nwaiting\n"<<"i="<<i<<"set size="<<sets.size()<<"u="<<u<<" flag="<<flag[i][u]<<"\n";
cv.wait(lk, [i]{return (sets.size()>0&&flag[i][u]==0)?true:false;});
std::cout<<"came out i="<<i<<"\n";
flag[i][u]=1;
for(int qw=0;qw<4;qw++)
{
x[i].push_back(sets[0][qw]);
}
lk.unlock();
std::unique_lock<std::mutex> lq(as);
count++;
cb.notify_one();
lq.unlock();
j++;
}
std::cout<<"size of map of "<<i<<"is "<<x[i].size()<<"\n";
for(int w=0;w<12;w++)
{
std::cout<<x[i][w]<<" ";
}
std::cout<<"\n";
return;
}
int main()
{
std::vector<std::vector<std::string>> r;
for(int i=0;i<2;i++)
{
std::vector<std::string> e;
x.push_back(e);
}
std::vector<std::thread> threads;
std::string s[][4]={
{"Test","Create","Delete","Add"},
{"class","object","demo","status"},
{"Deep_Learning","Neural_Network","Blockchain"}
};
while(y<3)
{
std::vector<std::string> q;
for(int i=0;i<4;i++)
{
q.push_back(s[y][i]);
}
r.push_back(q);
y++;
}
for(int i=0;i<2;i++)
{
threads.push_back(std::thread(see,i));//creating thread
}
y=0;
//Main code starts from below
while(y<3)
{
std::cout<<"pushing\n";
sets.push_back(r[y]);//first passing set 1 to all threads
cv.notify_all();
std::unique_lock<std::mutex> lt(p);
cb.wait(lt, []{return count==2;});
std::cout<<"main y="<<y<<"\n";
sets.pop_back();
u++;
count=0;
y++;
}
for(int i=0;i<2;i++)
{
threads[i].join();
}
return 0;
}
输出:
waiting
i=0set size=pushing
waiting
i=1set size=0u=0 flag=0
came out i=1
waiting
i=1set size=1u=0 flag=1
0u=0 flag=0
came out i=0
waiting
i=0set size=1u=0 flag=1
main y=0
pushing
came out i=1
waiting
i=1set size=1u=1 flag=1
(Output is not terminating and i think it went into dead lock can anyone help why it is not
terminating)
请使用选项-fsanitize = thread进行编译