我是线程和互斥的新手,我正在尝试学习它们。我编写了一些代码,这些代码通常会创建一个队列,以将文件中的所有数字排入队列(此文件包含将近20.000行和大量信息),因为此文件包含大量信息,供程序使用–初次使用时需要多线程创建线程数,然后停留在while循环中的部分ı想查看哪些线程进入了从队列中取出id的循环,但是显然只有第一个创建的线程进入了所有线程并使其出队,ı使用了互斥锁确保当一个线程进入循环时使其进行处理(使一个数字出队),然后解锁此互斥锁,以便其他线程可以进入,但显然这是一个错误。这是代码`
void printer( DynIntQueue & myQueue) // takes the Dynamic Queue
{
//int count = 0;
queMutex.lock(); // lock it before any threads come it
while(!myQueue.isEmpty()) // check this condition
{
int num;
cout << "Thread " << this_thread::get_id << " is working" << endl; // this is for printing out which threads enter this loop
myQueue.dequeue(num); // deqeueu this number from queue
queMutex.unlock(); // unlock this in order to next thread might enter
queMutex.lock(); // when this thread enters lock it in order to other threads to wait
}
queMutex.unlock(); // if myQueue is empty since it is firsly locked,unlock this
}`
我的输出是这样的: Thread 005C1659 is working Thread 005C1659 is working Thread 005C1659 is working Thread 005C1659 is working Thread 005C1659 is working Thread 005C1659 is working Thread 005C1659 is working Thread 005C1659 is working Thread 005C1659 is working Thread 005C1659 is working
一直进行到myQueue为空且具有相同线程为止。我该怎么做才能确保其他线程可能会进入此循环?
编辑:这是主要部分`
int main()
{
DynIntQueue firstQueue;
ifstream input;
string line;
int numofthreads;
input.open("data.tsv");
getline(input,line); // for first empty
int id,houseAge,avgRooms,avgBedRooms,latitue,longitute,medianPrice;
cout << "Please enter the number of threads you want " << endl;
cin >> numofthreads;
vector <thread> Threads(numofthreads);
while (!input.eof())
{
getline(input,line);
istringstream divider(line);
divider >> id >> houseAge >> avgRooms >> avgBedRooms >> latitue >> longitute >> medianPrice;
firstQueue.enqueue(id);
}
for (int i = 0; i < numofthreads; i++)
{
Threads[i] = thread(&printer,ref(firstQueue));
}
for (int i = 0; i < numofthreads; i++)
{
Threads[i].join();
}
return 0;
}