An AsyncDuplicateLock that can be locked on all keysAsynchronous locking based on a keyOptimistic vs. Pessimistic lockingHow can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?Volatile vs. Interlocked vs. lockHow can I upload files asynchronously?Why is lock(this) … bad?How can I get the application's path in a .NET console application?How to loop through all enum values in C#?How can I generate random alphanumeric strings?How does lock work exactly?ReaderWriterLockSlim questions
Can I Retrieve Email Addresses from BCC?
(Bedrock Edition) Loading more than six chunks at once
Coordinate position not precise
Lay out the Carpet
Is this Spell Mimic feat balanced?
I'm in charge of equipment buying but no one's ever happy with what I choose. How to fix this?
Using parameter substitution on a Bash array
Failed to fetch jessie backports repository
Hide Select Output from T-SQL
What does this 7 mean above the f flat
How can I use the arrow sign in my bash prompt?
How to be diplomatic in refusing to write code that breaches the privacy of our users
is this a spam?
If you attempt to grapple an opponent that you are hidden from, do they roll at disadvantage?
How does it work when somebody invests in my business?
How does residential electricity work?
voltage of sounds of mp3files
What is the intuitive meaning of having a linear relationship between the logs of two variables?
Is there a good way to store credentials outside of a password manager?
Have I saved too much for retirement so far?
Everything Bob says is false. How does he get people to trust him?
How can I replace every global instance of "x[2]" with "x_2"
Efficiently merge handle parallel feature branches in SFDX
apt-get update is failing in debian
An AsyncDuplicateLock that can be locked on all keys
Asynchronous locking based on a keyOptimistic vs. Pessimistic lockingHow can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?Volatile vs. Interlocked vs. lockHow can I upload files asynchronously?Why is lock(this) … bad?How can I get the application's path in a .NET console application?How to loop through all enum values in C#?How can I generate random alphanumeric strings?How does lock work exactly?ReaderWriterLockSlim questions
I need a lock similar to the one from this answer from Stephen Cleary: https://stackoverflow.com/a/31194647/4381408
However, I also need to be able to lock on all keys at the same time. I'm using Stephen Cleary's AsyncEx library as well, so I thought of combining the AsyncDuplicateLock with an AsyncReaderWriterLock like this:
public sealed class AsyncDuplicateReaderWriterLock
private AsyncReaderWriterLock _rwLock = new AsyncReaderWriterLock();
private AsyncDuplicateLock _duplicateLock = new AsyncDuplicateLock();
public IDisposable ReaderLock(object key)
return CollectionDisposable.Create(
_rwLock.ReaderLock(),
_duplicateLock.Lock(key)
);
public async Task<IDisposable> ReaderLockAsync(object key)
return CollectionDisposable.Create(
await _rwLock.ReaderLockAsync(),
await _duplicateLock.LockAsync(key));
public IDisposable WriterLock()
return _rwLock.WriterLock();
public async Task<IDisposable> WriterLockAsync()
return await _rwLock.WriterLockAsync();
This way, I can use ReaderLock to lock on a key, and WriterLock to lock on all keys. It's critical I get this right so I want to be sure that there's no way for this to deadlock or not lock properly. I don't feel confident enough about it.
So would this work, be somewhat efficient, and be threadsafe?
Thanks for the help!
c# .net asynchronous async-await locking
add a comment |
I need a lock similar to the one from this answer from Stephen Cleary: https://stackoverflow.com/a/31194647/4381408
However, I also need to be able to lock on all keys at the same time. I'm using Stephen Cleary's AsyncEx library as well, so I thought of combining the AsyncDuplicateLock with an AsyncReaderWriterLock like this:
public sealed class AsyncDuplicateReaderWriterLock
private AsyncReaderWriterLock _rwLock = new AsyncReaderWriterLock();
private AsyncDuplicateLock _duplicateLock = new AsyncDuplicateLock();
public IDisposable ReaderLock(object key)
return CollectionDisposable.Create(
_rwLock.ReaderLock(),
_duplicateLock.Lock(key)
);
public async Task<IDisposable> ReaderLockAsync(object key)
return CollectionDisposable.Create(
await _rwLock.ReaderLockAsync(),
await _duplicateLock.LockAsync(key));
public IDisposable WriterLock()
return _rwLock.WriterLock();
public async Task<IDisposable> WriterLockAsync()
return await _rwLock.WriterLockAsync();
This way, I can use ReaderLock to lock on a key, and WriterLock to lock on all keys. It's critical I get this right so I want to be sure that there's no way for this to deadlock or not lock properly. I don't feel confident enough about it.
So would this work, be somewhat efficient, and be threadsafe?
Thanks for the help!
c# .net asynchronous async-await locking
add a comment |
I need a lock similar to the one from this answer from Stephen Cleary: https://stackoverflow.com/a/31194647/4381408
However, I also need to be able to lock on all keys at the same time. I'm using Stephen Cleary's AsyncEx library as well, so I thought of combining the AsyncDuplicateLock with an AsyncReaderWriterLock like this:
public sealed class AsyncDuplicateReaderWriterLock
private AsyncReaderWriterLock _rwLock = new AsyncReaderWriterLock();
private AsyncDuplicateLock _duplicateLock = new AsyncDuplicateLock();
public IDisposable ReaderLock(object key)
return CollectionDisposable.Create(
_rwLock.ReaderLock(),
_duplicateLock.Lock(key)
);
public async Task<IDisposable> ReaderLockAsync(object key)
return CollectionDisposable.Create(
await _rwLock.ReaderLockAsync(),
await _duplicateLock.LockAsync(key));
public IDisposable WriterLock()
return _rwLock.WriterLock();
public async Task<IDisposable> WriterLockAsync()
return await _rwLock.WriterLockAsync();
This way, I can use ReaderLock to lock on a key, and WriterLock to lock on all keys. It's critical I get this right so I want to be sure that there's no way for this to deadlock or not lock properly. I don't feel confident enough about it.
So would this work, be somewhat efficient, and be threadsafe?
Thanks for the help!
c# .net asynchronous async-await locking
I need a lock similar to the one from this answer from Stephen Cleary: https://stackoverflow.com/a/31194647/4381408
However, I also need to be able to lock on all keys at the same time. I'm using Stephen Cleary's AsyncEx library as well, so I thought of combining the AsyncDuplicateLock with an AsyncReaderWriterLock like this:
public sealed class AsyncDuplicateReaderWriterLock
private AsyncReaderWriterLock _rwLock = new AsyncReaderWriterLock();
private AsyncDuplicateLock _duplicateLock = new AsyncDuplicateLock();
public IDisposable ReaderLock(object key)
return CollectionDisposable.Create(
_rwLock.ReaderLock(),
_duplicateLock.Lock(key)
);
public async Task<IDisposable> ReaderLockAsync(object key)
return CollectionDisposable.Create(
await _rwLock.ReaderLockAsync(),
await _duplicateLock.LockAsync(key));
public IDisposable WriterLock()
return _rwLock.WriterLock();
public async Task<IDisposable> WriterLockAsync()
return await _rwLock.WriterLockAsync();
This way, I can use ReaderLock to lock on a key, and WriterLock to lock on all keys. It's critical I get this right so I want to be sure that there's no way for this to deadlock or not lock properly. I don't feel confident enough about it.
So would this work, be somewhat efficient, and be threadsafe?
Thanks for the help!
c# .net asynchronous async-await locking
c# .net asynchronous async-await locking
edited Mar 21 at 15:36
t.baart
asked Mar 21 at 15:25
t.baartt.baart
6217
6217
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
I strongly, strongly advise you to take a step back, think about the actual problem you're trying to solve, explain it to someone else, and ask them how they would solve the concurrency issues.
That said, yes, you can (ab)use a reader/writer lock to do this. Personally, I would separate out the locking:
public IDisposable ReaderLock(object key)
var rwKey = _rwLock.ReaderLock();
var duplicateKey = _duplicateLock.Lock(key);
return CollectionDisposable.Create(rwKey, duplicateKey);
// (and the same for async)
This makes it more obvious that the code is taking the RWL first (which it must do, in order to be correct).
Thanks for the answer as well as the advice. I'll rethink why this is even necessary and see if I need to make changes so that this locking mechanism isn't needed anymore. At the moment, some of the operations don't have a known key (yet) but do require locking for possible concurrency issues. Not sure if it's possible, but it's probably better to rewrite those operations so that locking is no longer necessary until I do have a key.
– t.baart
2 days ago
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55283882%2fan-asyncduplicatelock-that-can-be-locked-on-all-keys%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I strongly, strongly advise you to take a step back, think about the actual problem you're trying to solve, explain it to someone else, and ask them how they would solve the concurrency issues.
That said, yes, you can (ab)use a reader/writer lock to do this. Personally, I would separate out the locking:
public IDisposable ReaderLock(object key)
var rwKey = _rwLock.ReaderLock();
var duplicateKey = _duplicateLock.Lock(key);
return CollectionDisposable.Create(rwKey, duplicateKey);
// (and the same for async)
This makes it more obvious that the code is taking the RWL first (which it must do, in order to be correct).
Thanks for the answer as well as the advice. I'll rethink why this is even necessary and see if I need to make changes so that this locking mechanism isn't needed anymore. At the moment, some of the operations don't have a known key (yet) but do require locking for possible concurrency issues. Not sure if it's possible, but it's probably better to rewrite those operations so that locking is no longer necessary until I do have a key.
– t.baart
2 days ago
add a comment |
I strongly, strongly advise you to take a step back, think about the actual problem you're trying to solve, explain it to someone else, and ask them how they would solve the concurrency issues.
That said, yes, you can (ab)use a reader/writer lock to do this. Personally, I would separate out the locking:
public IDisposable ReaderLock(object key)
var rwKey = _rwLock.ReaderLock();
var duplicateKey = _duplicateLock.Lock(key);
return CollectionDisposable.Create(rwKey, duplicateKey);
// (and the same for async)
This makes it more obvious that the code is taking the RWL first (which it must do, in order to be correct).
Thanks for the answer as well as the advice. I'll rethink why this is even necessary and see if I need to make changes so that this locking mechanism isn't needed anymore. At the moment, some of the operations don't have a known key (yet) but do require locking for possible concurrency issues. Not sure if it's possible, but it's probably better to rewrite those operations so that locking is no longer necessary until I do have a key.
– t.baart
2 days ago
add a comment |
I strongly, strongly advise you to take a step back, think about the actual problem you're trying to solve, explain it to someone else, and ask them how they would solve the concurrency issues.
That said, yes, you can (ab)use a reader/writer lock to do this. Personally, I would separate out the locking:
public IDisposable ReaderLock(object key)
var rwKey = _rwLock.ReaderLock();
var duplicateKey = _duplicateLock.Lock(key);
return CollectionDisposable.Create(rwKey, duplicateKey);
// (and the same for async)
This makes it more obvious that the code is taking the RWL first (which it must do, in order to be correct).
I strongly, strongly advise you to take a step back, think about the actual problem you're trying to solve, explain it to someone else, and ask them how they would solve the concurrency issues.
That said, yes, you can (ab)use a reader/writer lock to do this. Personally, I would separate out the locking:
public IDisposable ReaderLock(object key)
var rwKey = _rwLock.ReaderLock();
var duplicateKey = _duplicateLock.Lock(key);
return CollectionDisposable.Create(rwKey, duplicateKey);
// (and the same for async)
This makes it more obvious that the code is taking the RWL first (which it must do, in order to be correct).
answered Mar 23 at 1:05
Stephen ClearyStephen Cleary
287k47482604
287k47482604
Thanks for the answer as well as the advice. I'll rethink why this is even necessary and see if I need to make changes so that this locking mechanism isn't needed anymore. At the moment, some of the operations don't have a known key (yet) but do require locking for possible concurrency issues. Not sure if it's possible, but it's probably better to rewrite those operations so that locking is no longer necessary until I do have a key.
– t.baart
2 days ago
add a comment |
Thanks for the answer as well as the advice. I'll rethink why this is even necessary and see if I need to make changes so that this locking mechanism isn't needed anymore. At the moment, some of the operations don't have a known key (yet) but do require locking for possible concurrency issues. Not sure if it's possible, but it's probably better to rewrite those operations so that locking is no longer necessary until I do have a key.
– t.baart
2 days ago
Thanks for the answer as well as the advice. I'll rethink why this is even necessary and see if I need to make changes so that this locking mechanism isn't needed anymore. At the moment, some of the operations don't have a known key (yet) but do require locking for possible concurrency issues. Not sure if it's possible, but it's probably better to rewrite those operations so that locking is no longer necessary until I do have a key.
– t.baart
2 days ago
Thanks for the answer as well as the advice. I'll rethink why this is even necessary and see if I need to make changes so that this locking mechanism isn't needed anymore. At the moment, some of the operations don't have a known key (yet) but do require locking for possible concurrency issues. Not sure if it's possible, but it's probably better to rewrite those operations so that locking is no longer necessary until I do have a key.
– t.baart
2 days ago
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55283882%2fan-asyncduplicatelock-that-can-be-locked-on-all-keys%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown