On Wed, Mar 30, 2011 at 9:39 PM, Jason House <[email protected]> wrote: > Jose Armando Garcia Wrote: > >> Why am I getting this error? I suspect that synchronized is the >> problem. > > A synchronized class is implicitly shared and most of the methods are > synchronized. I say most because at a minimum, the constructor isn't > synchronized on anything. As you probably know shared is transitive, so all > members are implicitly shared as well. > > >> How do I get around this error? > > That's not easy to answer... To get the compiler to shut up, you can copy > and paste FILE's destructor and mark it as shared. Of course, every method > call to your file will similarly required shared methods. If you make no > copies of the file object, and all accesses are from within your synchronized > methods, you can probably cast away shared while making the method calls. Of > course, the common theme here is that you're verifying the multi-threaded > safety of all this stuff along the way. If you're not comfortable doing > that, then you probably want to do another design that you can prove works. > >
This is a great suggestion and that is what I do in my implementation of the synchronized class but I can't cast away the call to the dtor. That call is done by the compiler. I am going to look into __gshared. >> Does this mean that >> synchronized classes are not allowed to have as member >> unsynchronized/regular classes? > > As I said above, shared is transitive. It's implicit that all members are > shared even though you don't mark them as such. No shared objects can have > non-shared members. If there are parts that are not accessed by more than > one thread, you can either restructure your code a bit, or make liberal use > of casts. > > >> Has anyone tried to write a >> multithreaded application using D? > > Yes, and even succeeded :) > > Which? And it it cannot be named what does it do? How many lines of code? >> Why is the error showing up in >> std/stdio.d and not in my file? > > It's an awful error message. I complained about it back in 2009: > http://d.puremagic.com/issues/show_bug.cgi?id=3642 > > When this kind of thing pops up, it's either misusing the object (shouldn't > be shared), or the object is missing a shared method. The error is really > awful. After finding this case, I spotted a few others. This error message > is extremely generic and used in many other cases. In more mature areas of > the code, the compiler issues a much more helpful message on the very next > line. For shared, there's no specialized error message and it leaves the > user scratching their head... > > >> Can anyone point me to a decent >> documentation of how "shared" works? I have read chapter 13 of The D >> Programming Language and it is not sufficient for the level of >> understanding I seek. > > Nope. D is notorious for having no specs or other documentation to give a > detailed understanding. I would have assumed TDPL was the best place. (I > don't have a copy) > > >> That is a lot of question. Hopefully I get answer to at least one. > >
