c# - Lock and do all work, or release and grab only when necessary? -
which of these 2 alternatives better one?
locking outside loops?
lock (_worklock) { foreach (var resultobject in getobjecttask.result) { foreach (var key in resultobject.keys) { string value = resultobject.getvalue(key); _lockedobject.dosomething(key, value); } } }
or locking when locked object accessed?
foreach (var resultobject in getobjecttask.result) { foreach (var key in resultobject.keys) { string value = resultobject.getvalue(key); lock (_worklock) _lockedobject.dosomething(key, value); } }
there can potentially 5-10 simultaneous operations wanting @ same time. here's surrounding code:
var tasks = provider in _objectproviders select task.factory.startnew(() => provider.objects) .continuewith(getobjecttask => { // 1 of operation bodies above go here }); var tasklist = task.whenall(tasks); tasklist.wait(); // use results operations here
edit: isn't answer, i'm not posting answer, after input in comment section, refactored code such, , no longer need lock @ all:
var tasks = (from provider in _objectproviders select task.factory.startnew(() => provider.objects)).tolist(); while (tasks.count > 0) { int completedtask = task.waitany(tasks.toarray<task>()); var task = tasks[completedtask]; var objects = task.result; foreach (var resultobject in objects) { foreach (var key in resultobject.keys) { string value = resultobject.getvalue(key); _unlockedobject.dosomething(key, value); } } tasks.removeat(completedtask); }
it depends!
which 1 better 100% dependent on task doing.
grabbing lock inside loop means waste ton of time acquiring , releasing lock. however, if of time spent doing non-locked parallel things, free lock enough more parallelism.
grabbing lock @ top of loop prevents parallelism, saves on locking, can expensive compared operation.
all can @ profiler , find out 1 best in situation. reference, locks on modern hardware take 100-150 operations lock/unlock if there no contention (that's rough rule of thumb, not hard set value).
consider third option hybrid of two: of parallel operations, , batch serial operations. perhaps every 10 objects, grab lock , of serial work. lets best of both worlds
Comments
Post a Comment