Two things about shared
Jason House
jason.james.house at gmail.com
Fri Mar 25 15:56:19 PDT 2011
Do you require that ThreadsafeLogger is a Logger, or is it ok if ThreadsafeLogger has a Logger? The latter is trivial to implement.
Benjamin Thaut Wrote:
> First thought:
> Consider the following code:
>
> import std.concurrency;
>
> class Logger {
> void log(string msg){
> //do logging
> }
> }
>
> class ThreadsafeLogger : Logger {
> private:
> Tid m_Tid;
> public:
> this(){
> m_Tid = thisTid();
> }
>
> /// Returns: tid of owning process
> Tid getTid(){ return m_Tid; }
>
> //this should get called by any thread other then the owner
> void log(string msg) shared {
> send(getTid(),msg);
> }
>
> // this gets called by the owning thread every now and then
> void progressMessages(){
> receiveTimeout(0,
> (string msg){
> //this calles the non shared version
> this.log(msg);
> }
> );
> }
> }
>
> The idea behind is to use the functionality of the already implemented
> class for a call from the owning thread and pass messages for any
> threads accessing the functionally from outside of the owning thread
> into the owning thread. Unfortunately D prevents me from implementing it
> like this because it thinks I want to override log, which I cleary not
> want to do, which can be recognized from the shared attribute.
> The only solution to solve this is to modifiy the original class, by
> adding a shared log function, which I wanted to prevent.
> So would it be usefull to remove this compiler error? Or is there some
> problem connected to this I'm not seeing?
>
> Second thought:
>
> synchronized class main {
> private:
> ILogger m_Logger;
> IGame m_Game;
> public:
> void work(){
> //do something with m_Logger and m_Game
> }
>
> ILogger getLogger(){
> return m_Logger;
> }
> }
>
> In the above class both m_Logger and m_Game get the shared attribute.
> The shared attribute for the m_Logger variable is ok, because it can be
> queried from the class, and it could be used in other threads.
> But the m_Game variable is completely encapsuled into the class and can
> only be used from within the class. As the synchronized prevents any
> paralell use of the class, it should be save to assume that m_Game never
> gets used by multiple threads simulatiously and does not need the shared
> attribute. What do you think about this? Is there some reason to not do
> this I'm not seeing?
>
> --
> Kind Regards
> Benjamin Thaut
More information about the Digitalmars-d
mailing list