如何解决如何在C ++中正确使用互斥体在循环中?
我是线程和互斥的新手,我正在尝试学习它们。我编写了一些代码,这些代码通常会创建一个队列,以将文件中的所有数字排入队列(此文件包含将近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;
}
解决方法
注意:std :: this_thread :: get_id()是一个函数,因此您应该调用它。我认为这只是复制/粘贴错误。
如果我在打开和关闭队列之间添加了一些工作,我会清楚地看到使用该队列的两个线程。
我认为您所显示的代码没有任何问题。
#include <iostream>
#include <thread>
#include <mutex>
#include <queue>
struct DynIntQueue {
bool isEmpty() const { return q_.empty(); }
void dequeue(int &elem) { elem = q_.front(); q_.pop(); }
std::queue<int> q_{{10,20,4,8,92}};
};
std::mutex queMutex;
void printer( DynIntQueue & myQueue) {
queMutex.lock();
while(!myQueue.isEmpty()) {
int num;
std::cout << "Thread " << std::this_thread::get_id() << " is working" << std::endl;
myQueue.dequeue(num);
queMutex.unlock();
std::cout << "working outside the lock" << std::endl;
std::cout << "working outside the lock" << std::endl;
std::cout << "working outside the lock" << std::endl;
std::cout << "working outside the lock" << std::endl;
std::cout << "working outside the lock" << std::endl;
queMutex.lock();
}
queMutex.unlock();
}
int main() {
std::cout << "Hello World!\n";
DynIntQueue q;
std::thread t1([&q]() { printer(q); });
std::thread t2([&q]() { printer(q); });
t1.join();
t2.join();
}
$ clang++-7 -pthread -std=c++17 -o main main.c
$ ./main
Hello World!
Thread 139686844172032 is working
working outside the lock
working outside the lock
working outside the lock
working outside the lock
working outside the lock
Thread 139686835779328 is working
working outside the lock
working outside the lock
working outside the lock
working outside the lock
working outside the lock
Thread 139686844172032 is working
working outside the lock
working outside the lock
working outside the lock
working outside the lock
working outside the lock
Thread 139686835779328 is working
working outside the lock
working outside the lock
working outside the lock
working outside the lock
working outside the lock
Thread 139686844172032 is working
working outside the lock
working outside the lock
working outside the lock
working outside the lock
working outside the lock
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。