Also, neither is cascading sends in a thread (like the ts show: xxx; cr
in your example)...
For things like that, you can use
ThreadSafeTranscript with: [ :aStream | ], or if you prefer Transcript
protocols, implement a method doing the same but with self as parameter.
- This will have some overhead though, seeing as how you'll usually be
reentering the critical section once for each call.
Something like:
TreadSafeTranscript >> doUninterruptably: aBlock
accessSemaphore critical: [aBlock value: self]
and you'll write:
1 to: 10 do: [:i |
[
tr doUninterruptably: [:transcript | transcript show: i
printString, ' fork ' ; cr.].
(semaphores at: i) signal.
] fork.
Cheers,
Henry
On 01.07.2009 19:45, Henrik Sperre Johansen wrote:
Look at forMutualExclusion implementation, and you'll see it's set up
with one excess signal.
So the first thing to wait for it, doesn't have to wait, ie. your
semaphores do:[]... falls straight through and 'all forks processed'
gets displayed before any of the forks are run.
Substitute with new, and you SHOULD get the behaviour you expect.
However, show: is NOT threadsafe, it releases access lock between
nextPutAll and endEntry, thus you often end up with several threads
writing to stream, then endEntry displaying them multiple times
If you change nextPutAll: back to show: in the code below, this is
apparent (at least it was on my machine...)
|semaphores tr|
semaphores := Array new: 10.
tr := ThreadSafeTranscript new.
tr open.
1 to: 10 do: [ :index | semaphores at: index put: Semaphore new ].
1 to: 10 do: [:i |
[
tr nextPutAll: i printString, ' fork '; cr.
(semaphores at: i) signal.
] fork
].
semaphores do: [:each | each wait ].
tr show: 'all forks proccesed'; cr.
Cheers,
Henry
On 01.07.2009 16:41, Mariano Martinez Peck wrote:
Hi folks! I am doing some benchmarks and I having problems with fork
(I think).
I have this method collect:
collect
|semaphores tr|
semaphores := Array new: 10.
tr := ThreadSafeTranscript new.
tr open.
1 to: 10 do: [ :index | semaphores at: index put: Semaphore
forMutualExclusion ].
1 to: 10 do: [:i |
[
tr show: 'one fork'; cr.
(semaphores at: i) signal.
] fork
].
semaphores do: [:each | each wait ].
tr show: 'all forks proccesed'; cr.
What I want is that the method collect returns when ALL of the forks
created inside, are finished. Obviously in my real code, I don't do a
transcript show: but another thing.
I would expect something like this:
one fork
one fork
one fork
one fork
one fork
one fork
one fork
one fork
one fork
one fork
all forks proccesed
But the output is:
all forks proccesed
one fork
one fork
one fork
one forkone fork
one fork
one fork
one forkone fork
one fork
one fork
one forkone fork
So, I guess it isn't working :( I don't know too much about forks
so any help is welcome!
can be a problem with ThreadSafeTranscript ? If so, how could I
test if my code is working as expected ?
Thanks,
Mariano
------------------------------------------------------------------------
_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
------------------------------------------------------------------------
_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project