Hello all again .
i have couple of questions again which i would appreciate any kind of help and answer,
my first question is about packaged_task and how we can use it ,
i mean i tried using packaged_task with functions , with parameters , and i got errors doing it . so do we always have to use class or stcucts in order for us to use packaged_task ?
how can i send some arguments to a function when im trying to make a package out of ?
i have done the packaging with parameterelss functions , but i dont know how im supposed to pass parameters ! :
here is my application working with parameterless functions .
//in the name of GOD
//Seyyed Hossein Hasan Pour
//Learning Boost- How Threading works in Boost
//How to pass parameters to functions in packaged_task
#define BOOST_THREAD_USE_LIB
#include <iostream>
#include <cstdlib>
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace std;
vector<int> SharedResource;
boost::shared_mutex sharedMutex;
int FillSharedResource()
{
int numberOfItems=10;
for (int i = 0; i< numberOfItems; i++)
{
boost::unique_lock<boost::shared_mutex> lock(sharedMutex);
SharedResource.push_back(i);
lock.unlock();
}
return 10;
}
int Print1()
{
for (int i = 0; i< SharedResource.size(); i++)
{
boost::this_thread::sleep(boost::posix_time::seconds(1));
boost::lock_guard<boost::shared_mutex> locker(sharedMutex);
cout<<boost::this_thread::get_id()<<"\tItem: "<<SharedResource[i]<<endl;
}
return 101;
}
int Print2()
{
for (int i = 0; i< SharedResource.size(); i++)
{
boost::this_thread::sleep(boost::posix_time::seconds(1));
boost::lock_guard<boost::shared_mutex> locker(sharedMutex);
cout<<boost::this_thread::get_id()<<"\tItem: "<<SharedResource[i]<<endl;
}
return 102;
}
int main()
{
boost::packaged_task<int>
pkg0(FillSharedResource),
pkg1(Print1),
pkg2(Print2);
boost::thread
t0(ref(pkg0)),
t1(ref(pkg1)),
t2(ref(pkg2));
boost::unique_future<int>
f0(pkg0.get_future()),
f1(pkg1.get_future()),
f2(pkg2.get_future());
std::cout<< f0.get()<<"\n"<< f1.get()<< "\n"<< f2.get();
system("pause");
return 0;
}
-------------------------
can someone show me a simple sample of using Promise in threading ? i mean i already know about future , whats the need for Promise ? !
--------------------------
whats the different between read_some and async_read_some ? in asio ?
--------------------------
i know that when i need to send an argument to event handler ( signal ) , i frist should declare sth like this :
boost::signal2::signal <function-return-type (paramerter type)> mysignal ;
mysignal.connect(myfunc,my-functions-argumant);
mysignal.connect(myfunc2,my-function2s-argumant);
now if i have couple of functions with the same signature , doing different jobs with different arguments , how can i give their respective arguments ?
i mean at the moment , i can only write :
mysignal(5);!
and this passes 5 to all functions connected with this signal! do i really have to make one signal for each functions ?so that i can pass different and yet with the same type argument to different functions using one signal . is'nt there any other way around it ?
if inside a signal , i run a thread and then i block that signal using signal.block , would that block that thread too ? and then unblocking it would it unblock that thread too ? is it safe doing this ?
---------------------------
why do we use function names with const that the end of it ? i mean sth like this :
void operator()() const
{
}
or
void boostFunctionName(sth) const
{
}
what is that const for ? what does it declare ? why is it necessary to use it that way ?
--------------------
how do i serialize a class of mine ? i mean i read that if i have vector , i need to use some functions , if i have foo i need another function ! what exactly do you serialize your classes ? i mean maybe i have std::string , char , vectors of some kind , and a self made class or type used in my class to be serialized , how should i go about it . any guidance is greatly appreciated .
---------------------
i tired to use boost::container::vector for storing my threads , and it went just fine . but i have a problem in determining which thread is which , i mean i already found out that i can use if-else for this matter , but since i used a vector , and the number of threads being created at run-time is not known , so i need to use a for statement so that i can iterate throuh all of th evectors items and then if i find a match , i do as i wish . the problem is , when i try to have sth like this , it fails :
boost::id id = myvect[0]
i want to pass this id for matching operation ( or declare it as global ) , what am i missing again ?
another problem i have in this regard is that , when i store my threads in a lets say vector just like the sample i gave earlier , it is not guaranteed that threads inside that vector actually points to a legal thread of execution by the time i go to check for sth .!( i mean there is a good chance that they already ran and got terminated!) seemingly i can not use joinable to see if i am dealing with an active or lets say legitimate thread ! , my question is , how can i check to see if an object of type thread , actually points to sth real ?
how to check that ?
---------------------
when i try to compile source codes using Asio using MingW , i get linking errors ! what is the cause and how can i fix that ?
i get the errors:
C:\boost_1_49_0\boost\asio\detail\impl\winsock_init.ipp|39|undefined reference to `WSAStartup@8'|
C:\boost_1_49_0\boost\asio\detail\impl\winsock_init.ipp|48|undefined reference to `WSACleanup@0'|
Thank you all in advance
Seyyed Hossein Hasan Pour