On 22/09/15 08:48, Aaron Meriwether wrote:
On Sep 20, 2015, at 1:20 AM, Ray Satiro via curl-library
<[email protected]> wrote:
On 9/18/2015 6:47 AM, doa379 wrote:
On 18/09/15 01:22, Aaron Meriwether wrote:
On Sep 17, 2015, at 1:06 PM, doa379 <[email protected]> wrote:
I think my issue has resolved itself by putting in a delay to some of the
operations in the threads.
If you use delays to "fix" a bug in a threaded program, you are doing it wrong,
and the bug will almost certainly resurface later to bite you.
-Aaron
On 18/09/15 05:53, Ray Satiro via curl-library wrote:
That doesn't sound right. I think your solution is possibly covering up
a problem with the design of your program.
The program follows this example:
http://softpixel.com/~cwright/programming/threads/threads.c.php
The example has two threads and is using usleep like a yield to allow for a
task switch but I don't think he adequately explains that. The order in which
the output appears in your console is unpredictable, however it will usually
alternate.
"The output will be (mostly) alternating lines as the main() and threadFunc()
threads execute and pause. Without the usleep()'s they'll not switch because we aren't
doing anything that takes long enough to consume our whole time slice."
He is trying to show how a scheduler will run threads by multiplexing them in time
slices on a core. Scheduler says do some of this thread then time's up and
scheduler says do some of that thread and so on. But the whole time slice isn't
necessarily consumed and also both threads may be running at the same time in
parallel truly concurrent if they're running on different cores. They may
alternate because they're both calling printf and there is lock contention to
obtain ownership of stdout. In other words one thread has to wait to write if the
other is writing to the same. Also, usleep guarantees at a minimum suspension of n
microseconds if no signal, not maximum so it could be any amount of microseconds
>= n before a thread resumes.
I think we are treading outside the scope of this list now but how have you
followed the example in your program? My take so far is you have one thread
that is performing the transfer using libcurl and receiving a continuous stream
of records, and those records are then processed by other threads concurrently.
I don't understand why you would fork the libcurl thread; also there seem to be
some problems with forking and multi-threading. I am mostly in Windows so
someone experienced in forking multi-threaded apps would be better to explain
why you should or shouldn't do that.
Right, the softpixel page mentions several different thread-related concepts. The
"usleep" in the examples is not being used to reliably resolve a race
condition, but as a hack to give a higher probability that the example will exhibit
interesting behavior. That page also mentions the use of mutexes, which is the proper
path if you need reliable inter-thread resource-sharing. However, neither of the
multithreading examples given on that page actually make use of a mutex.
If you want to use curl in the background, writing to an in-memory buffer, and
to access that buffer from another thread, you will need to use a mutex to
ensure that the accesses from your two different threads do not conflict. I've
written a quick example to show how you can use a background worker thread and
a mutex in order to safely accomplish this:
https://gist.github.com/p120ph37/906fa4af65da7948d69b
-Aaron
Yes this is a correct way to do it. Ideally. Locking resources whilst
manipulating the respective variables in set order.
At the moment I have one thread running which is crudely updating data
from the internet into some variables. As the performance is limited by
network latency there's appears to be less of a reason to slow things
down in infinite loops using usleep() function say.
Thanks for your suggestion.
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette: http://curl.haxx.se/mail/etiquette.html