Atomic statements in multithreading

suppose I am working in multiple thread each thread runs following
steps:

step-1
step-2
step-3
step-4
step-5

now I want to make step 2 and step 3 an atomic statement, it means when
one thread goes to statement 2, every other thread should stop and run
only when that particular thread completes step 3. Is it possible? How?

note mutex is not the solution, as mutex keeps thread not running a
block of code at same time, here if one thread goes to the block all
other thread should stop.

That is not what “atomic” would usually mean; what you’re asking for is
a mix of many other concepts. Thread.exclusive may be want you want:

step-1
Thread.exclusive do
step-2
step-3
end
step-4
step-5

But it’s loaded with gotchas and you may want to be more explicit; or
indeed, work out a way to not need this synchronisation between threads.

Arlen C. wrote in post #1086450:

That is not what “atomic” would usually mean; what you’re asking for is
a mix of many other concepts. Thread.exclusive may be want you want:

step-1
Thread.exclusive do
step-2
step-3
end
step-4
step-5

But it’s loaded with gotchas and you may want to be more explicit; or
indeed, work out a way to not need this synchronisation between threads.

Does it do the same as: ??

Thread.list.each do |t|
if t!=Thread.current
t.stop
end
end
step-2
step-3
Thread.list.each do |t|
if t!=Thread.current
t.run
end
end

On Mon, Nov 26, 2012 at 12:03 PM, ajay paswan [email protected]
wrote:

now I want to make step 2 and step 3 an atomic statement, it means when
one thread goes to statement 2, every other thread should stop and run
only when that particular thread completes step 3. Is it possible? How?

note mutex is not the solution, as mutex keeps thread not running a
block of code at same time, here if one thread goes to the block all
other thread should stop.

Why do you want to do that? That will cripple throughput more than
necessary.

Kind regards

robert

Robert K. wrote in post #1086457:

Why do you want to do that? That will cripple throughput more than
necessary.

Kind regards

robert
To solve: Click on link not working with ie #watir-webdriver - Ruby - Ruby-Forum

Robert K. wrote in post #1086464:

On Mon, Nov 26, 2012 at 1:15 PM, ajay paswan [email protected]
wrote:

Robert K. wrote in post #1086457:

Why do you want to do that? That will cripple throughput more than
necessary.

To solve: Click on link not working with ie #watir-webdriver - Ruby - Ruby-Forum

I don’t see how your solution is necessary to solve that.

Cheers

robert

basically I am unable to click a link on ie, so I got an alternating bad
solution (sometimes doesnt work) to focus on link and then clicking. I
don’t want to lose focus of the link before it is clicked due to
multithreading. am I able to make you understand?

Please reply if I need to clarify more.

Are you sure you need to stop other threads in CURRENT process? Very
unlikely. Why don’t you write threads stopper and resumer yourself and
test?

2012/11/26 ajay paswan [email protected]

On Mon, Nov 26, 2012 at 1:15 PM, ajay paswan [email protected]
wrote:

Robert K. wrote in post #1086457:

Why do you want to do that? That will cripple throughput more than
necessary.

To solve: Click on link not working with ie #watir-webdriver - Ruby - Ruby-Forum

I don’t see how your solution is necessary to solve that.

Cheers

robert

Nikita Zubkov wrote in post #1086480:

Are you sure you need to stop other threads in CURRENT process? Very
unlikely. Why don’t you write threads stopper and resumer yourself and
test?

2012/11/26 ajay paswan [email protected]

Isnt what i wrote is the stopper and resumer you are talking about? is
that correct?

On Mon, Nov 26, 2012 at 4:03 AM, ajay paswan [email protected]
wrote:

note mutex is not the solution, as mutex keeps thread not running a
block of code at same time, here if one thread goes to the block all
other thread should stop.

I’m still not sure I entirely understand what you want, but you can make
other threads block on a Queue if you would like for them to wait until
some event has completed.

Alternatively you can use a Mutex + ConditionVariable.