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

Popular posts from this blog

php - Submit Form Data without Reloading page -

linux - Rails running on virtual machine in Windows -

php - $params->set Array between square bracket -