线程死锁(我认为)

问题描述 投票:2回答:1

我是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) 
c++ multithreading deadlock
1个回答
0
投票

请使用选项-fsanitize = thread进行编译

© www.soinside.com 2019 - 2024. All rights reserved.