c++ - Is read-only access to a vector (vector::operator[] and vector::size()) asynchronous-safe? -
my programme needs perform read-only access contents of vector<string> in signal handler sigint. (the alternative utilize fixed-size array of fixed-length c strings.) programme designed run in posix environment.
are vector::operator[] , vector::size() asynchronous-safe (or signal-safe)?
angew's reply right considering c++. question mentions posix environment, provide stronger guarantees, needs answer, is:
if process multi-threaded, or if process single-threaded , signal handler executed other result of:
the process calling abort(), raise(), kill(), pthread_kill(), or sigqueue() generate signal not blocked
a pending signal beingness unblocked , beingness delivered before phone call unblocked returns
the behavior undefined if signal handler refers object other errno static storage duration other assigning value object declared volatile sig_atomic_t, or if signal handler calls function defined in standard other 1 of functions listed in next table.
source: open grouping base of operations specifications issue 7 ieee std 1003.1, 2013 edition, 2.4.3
this is... still weak guarantee. far can understand this:
vector::operator[] not safe. fixed arrays not safe. access fixed arrays safe if array non-static.
why? vector::operator[] doesn't specify how should implemented, preconditions , postconditions. access elements of array possible (if array non-static), implies access vector elements safe if create pointer (with vec.data() or &vec[0]) before signalling, , accessing elements through pointer.
edit: missed because wasn't aware of sigaction function - signal access local arrays in signal handler, sigaction can provide pointers automatic , dynamically arrays. advice doing little possible in signal handlers still applies here though.
bottom line: you're doing much in signal handlers. seek doing little possible. 1 approach assign flag (of type volatile sig_atomic_t), , return. code can later check if flag triggered (e.g. in event loop)
c++ vector posix signal-handling async-safe
No comments:
Post a Comment