Чтобы проще описать мою проблему, рассмотрим следующую программу:
#include <boost/thread.hpp>
#include <list>
#include <iostream>
boost::shared_mutex shmutex;
std::list<int> l;
void thread_func_read(int num)
{
//boost::shared_lock<boost::shared_mutex> readLock(shmutex);
std::cout<<"Thread read "<<num<< " Data: ";
for (std::list<int>::iterator it=l.begin(); it!=l.end(); ++it)
{
std::cout<<*it<<" ";
}
std::cout<<std::endl;
sleep(5);
}
void thread_func_write(int num)
{
std::cout<<"Thread write "<<num<< " Data: ";
l.push_front(100);
std::cout<<std::endl;
sleep(5);
}
int main()
{
boost::thread_group thrds;
l.push_back(10);
l.push_back(20);
l.push_back(30);
l.push_back(40);
thrds.add_thread(new boost::thread(thread_func_read, 1));
thrds.add_thread(new boost::thread(thread_func_read, 2));
thrds.add_thread(new boost::thread(thread_func_read, 3));
thrds.add_thread(new boost::thread(thread_func_write, 4));
thrds.add_thread(new boost::thread(thread_func_write, 5));
thrds.join_all();
return 0;
}
Необходимо как-то реализовать через мьютексы множественное чтение списка (т. е. все потоки, использующие thread_func_read могут одновременно читать) и единичную запись (т. е. только один поток в настоящее время может производить запись в список). При этом запись в список должна быть возможна только после завершения чтения этого списка другими потоками, а само чтение невозможно, если в список производится запись. Несколько потоков не могут писать одновременно.
С первой часть всё понятно: нужно использовать shared_lock. А вот как быть с ограничением на запись?
Заранее спасибо!