Thanks for the precision Goswin. It is ok to have objects which you
cannot share between threads. But at least it is important that
functions exposed in the API are usable in any thread, even if the
objects passed as arguments are not shared between threads.
I have just had such issue while designing a stateful function that
needs static variables. So here I had to use thread_local. I have tested
it with 50 threads runned in parallel, that's alright. The function
asserts if no TLS is available.
An alternative would have been the caller passes a struct as argument,
but I find it too heavy.
I will propose a pull request this week-end. It is another version of
zmq_proxy_chain, I called it zmq_proxy_open_chain, and it includes the
end-points. So you can chain any proxies just in main for example. Very
cool to deal with protocol layers as you have suggested me, or for quick
prototyping. It really saves a lot of code.
Possibly the best is to replace simply zmq_proxy_chain instead of adding
a new function since you can do zmq_proxy_chain with
zmq_proxy_open_chain. There are two additional arguments, one for a
socket array of end-points, and one for the internal polling time-out.
It returns the index of the end-point triggered if any, or 0. The name
is "open" because when time-out is set, there is no more internal loop
and the application has to manage it.
Cheers,
Laurent
Le 01/02/2014 13:00, Goswin von Brederlow a écrit :
On Wed, Jan 29, 2014 at 02:39:46PM +0100, Laurent Alebarde wrote:
Hi Devs,
I assume every function in the libzmq API is thread safe, but there
are static variables in the code and no use of __thread ? Are all
static variables defined in libzmq global to all threads ?
If I add a static variable which need to be thread local, say inside
zmq::proxy, is it all right to add something like this in zmq.h ?
#if (__cplusplus > 199711L) || (defined(__STDCXX_VERSION__) &&
(__STDCXX_VERSION__ >= 201001L))
#define _TTHREAD_CPP0X_
#endif
#if !defined(_TTHREAD_CPP0X_) && !defined(thread_local)
#if defined(__GNUC__) || defined(__INTEL_COMPILER) ||
defined(__SUNPRO_CC) || defined(__IBMCPP__)
#define thread_local __thread
#else
#define thread_local __declspec(thread)
#endif
#endif
Found here:
https://github.com/DFHack/dfhack/blob/master/depends/tthread/tinythread.h
About __thread and thread_local:
http://stackoverflow.com/questions/7047226/using-thread-in-c0x
Usage:
static __thread char *p;
Cheers,
Laurent
As a side node: zmq is not thread safe, only parts of it are. Never
share sockets between threads for example. I would assume any thread
related function not to be thread safe, as in you can't call them from
two threads with the same socket. I bet message functions are also not
made thread save.
It goes with the "just don't share state" philosophy.
MfG
Goswin
_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev
_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev