Проблема увеличения потока, как разделить переменную, когда один поток не имеет ту же копию, что и другой?

Это, наверное, глупый вопрос, но я искал по всему интернету переменные и нашел все, что связано с мьютексами и условиями гонки, замками и т. Д .; но ничего, что, кажется, не решило бы эту простую проблему.

В основном код ниже создает два потока и в каждом потоке переменную shared_int изменяется для представления потока, в котором он используется. Потоки запускаются отдельно, а сам класс, кажется, имеет два экземпляра одной и той же переменной shared_int в двух разных темах? У меня проблема в том, что я хочу, чтобы эта переменная была изменена в любом потоке и читабельна, но я также хочу, чтобы значение shared_int видно из одного потока, чтобы быть одинаковым во втором. Вот код

#include <boost/thread.hpp>

template <typename I>
class threaded
{
private:

I volatile shared_int;

public:

threaded();
virtual ~threaded();
bool inputAvailable();
void thread_1();
void thread_2();
};

template <typename I>
threaded<I>::threaded(){}

template <typename I>
threaded<I>::~threaded(){}

template <typename I>
bool threaded<I>::inputAvailable()
{
struct timeval tv;
fd_set fds;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
select(STDIN_FILENO + 1, &fds, NULL, NULL, &tv);

return (FD_ISSET(0, &fds));
}

template <typename I>
void threaded<I>::thread_1()
{
shared_int = 1;

while(!inputAvailable())
{
std::cout<<"threaded::thread_1 shared_int "<<this->shared_int<<std::endl;
boost::this_thread::sleep_for( boost::chrono::milliseconds{ 9000});
};
}

template <typename I>
void threaded<I>::thread_2()
{
shared_int = 2;

while(!inputAvailable())
{
std::cout<<"threaded::thread_2 shared_int "<<this->shared_int<<std::endl;
boost::this_thread::sleep_for( boost::chrono::milliseconds{ 10000});
};
}

int main()
{
boost::thread_group thread;
threaded< int> threads;

thread.add_thread( new boost::thread( boost::bind( &threaded<int>::thread_1, threads)));
thread.add_thread( new boost::thread( boost::bind( &threaded<int>::thread_2, threads)));

thread.join_all();

return 0;
}

1

Решение

Этот код ниже, похоже, решает проблему. Оно использует boost::shared_ptr но это также работает с обычными указателями; в любом случае! Я все еще хотел бы решение, которое передает объекты по значению вместо указателей, черт возьми, но указатели работают пока.

#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>

template <typename I>
class threaded
{
private:

I volatile shared_int;

public:

threaded();
virtual ~threaded();
bool inputAvailable();
void thread_1();
void thread_2();
};

template <typename I>
threaded<I>::threaded(){}

template <typename I>
threaded<I>::~threaded(){}

template <typename I>
bool threaded<I>::inputAvailable()
{
struct timeval tv;
fd_set fds;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
select(STDIN_FILENO + 1, &fds, NULL, NULL, &tv);

return (FD_ISSET(0, &fds));
}

template <typename I>
void threaded<I>::thread_1()
{
shared_int = 1;

while(!inputAvailable())
{
std::cout<<"threaded::thread_1 shared_int "<<this->shared_int<<std::endl;
boost::this_thread::sleep_for( boost::chrono::milliseconds{ 9000});
};
}

template <typename I>
void threaded<I>::thread_2()
{
shared_int = 2;

while(!inputAvailable())
{
std::cout<<"threaded::thread_2 shared_int "<<this->shared_int<<std::endl;
boost::this_thread::sleep_for( boost::chrono::milliseconds{ 10000});
};
}

int main()
{
boost::thread_group thread;
boost::shared_ptr< threaded <int> > threads{ new threaded <int>};

thread.add_thread( new boost::thread( boost::bind( &threaded<int>::thread_1, threads)));
thread.add_thread( new boost::thread( boost::bind( &threaded<int>::thread_2, threads)));

thread.join_all();
threads.reset();

return 0;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]