Does acquiring a spinlock require compare-and-swap or is swap enough?
Suppose we have a spinlock
implementation:
struct Lock {
locked : Atomic(bool),
}
Then an unlock function could be:
fun unlock(lock : &Lock) {
atomic_store(&lock.locked, false, release);
}
But what about lock
? Commonly, it uses a compare-and-swap like this:
fun lock(lock : &Lock) {
while atomic_compare_and_swap(&lock.locked, false, true, acquire) {}
}
But wouldn't a swap be enough for this? Something like this:
fun lock(lock : &Lock) {
while atomic_swap(&lock.locked, true, acquire) {}
}
Is there any problem with this?
concurrency atomic spinlock
add a comment |
Suppose we have a spinlock
implementation:
struct Lock {
locked : Atomic(bool),
}
Then an unlock function could be:
fun unlock(lock : &Lock) {
atomic_store(&lock.locked, false, release);
}
But what about lock
? Commonly, it uses a compare-and-swap like this:
fun lock(lock : &Lock) {
while atomic_compare_and_swap(&lock.locked, false, true, acquire) {}
}
But wouldn't a swap be enough for this? Something like this:
fun lock(lock : &Lock) {
while atomic_swap(&lock.locked, true, acquire) {}
}
Is there any problem with this?
concurrency atomic spinlock
add a comment |
Suppose we have a spinlock
implementation:
struct Lock {
locked : Atomic(bool),
}
Then an unlock function could be:
fun unlock(lock : &Lock) {
atomic_store(&lock.locked, false, release);
}
But what about lock
? Commonly, it uses a compare-and-swap like this:
fun lock(lock : &Lock) {
while atomic_compare_and_swap(&lock.locked, false, true, acquire) {}
}
But wouldn't a swap be enough for this? Something like this:
fun lock(lock : &Lock) {
while atomic_swap(&lock.locked, true, acquire) {}
}
Is there any problem with this?
concurrency atomic spinlock
Suppose we have a spinlock
implementation:
struct Lock {
locked : Atomic(bool),
}
Then an unlock function could be:
fun unlock(lock : &Lock) {
atomic_store(&lock.locked, false, release);
}
But what about lock
? Commonly, it uses a compare-and-swap like this:
fun lock(lock : &Lock) {
while atomic_compare_and_swap(&lock.locked, false, true, acquire) {}
}
But wouldn't a swap be enough for this? Something like this:
fun lock(lock : &Lock) {
while atomic_swap(&lock.locked, true, acquire) {}
}
Is there any problem with this?
concurrency atomic spinlock
concurrency atomic spinlock
edited Nov 13 '18 at 12:15
bzim
asked Nov 13 '18 at 12:09
bzimbzim
753514
753514
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
A compare-and-swap isn't really necessary. Atomically setting a flag true
if it is false
is logically equivalent to unconditionally setting it true
.
An unconditional swap might be slightly faster since it does not have to compare anything, although the real cost of an atomic read-modify-write operation is in obtaining and locking the cache line.
Here is an example of a C++ spinlock that uses exchange()
#include <atomic>
class mutex {
std::atomic<bool> flag{false};
public:
void lock()
{
while (flag.exchange(true, std::memory_order_acquire));
}
void unlock()
{
flag.store(false, std::memory_order_release);
}
};
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%2f53280739%2fdoes-acquiring-a-spinlock-require-compare-and-swap-or-is-swap-enough%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
A compare-and-swap isn't really necessary. Atomically setting a flag true
if it is false
is logically equivalent to unconditionally setting it true
.
An unconditional swap might be slightly faster since it does not have to compare anything, although the real cost of an atomic read-modify-write operation is in obtaining and locking the cache line.
Here is an example of a C++ spinlock that uses exchange()
#include <atomic>
class mutex {
std::atomic<bool> flag{false};
public:
void lock()
{
while (flag.exchange(true, std::memory_order_acquire));
}
void unlock()
{
flag.store(false, std::memory_order_release);
}
};
add a comment |
A compare-and-swap isn't really necessary. Atomically setting a flag true
if it is false
is logically equivalent to unconditionally setting it true
.
An unconditional swap might be slightly faster since it does not have to compare anything, although the real cost of an atomic read-modify-write operation is in obtaining and locking the cache line.
Here is an example of a C++ spinlock that uses exchange()
#include <atomic>
class mutex {
std::atomic<bool> flag{false};
public:
void lock()
{
while (flag.exchange(true, std::memory_order_acquire));
}
void unlock()
{
flag.store(false, std::memory_order_release);
}
};
add a comment |
A compare-and-swap isn't really necessary. Atomically setting a flag true
if it is false
is logically equivalent to unconditionally setting it true
.
An unconditional swap might be slightly faster since it does not have to compare anything, although the real cost of an atomic read-modify-write operation is in obtaining and locking the cache line.
Here is an example of a C++ spinlock that uses exchange()
#include <atomic>
class mutex {
std::atomic<bool> flag{false};
public:
void lock()
{
while (flag.exchange(true, std::memory_order_acquire));
}
void unlock()
{
flag.store(false, std::memory_order_release);
}
};
A compare-and-swap isn't really necessary. Atomically setting a flag true
if it is false
is logically equivalent to unconditionally setting it true
.
An unconditional swap might be slightly faster since it does not have to compare anything, although the real cost of an atomic read-modify-write operation is in obtaining and locking the cache line.
Here is an example of a C++ spinlock that uses exchange()
#include <atomic>
class mutex {
std::atomic<bool> flag{false};
public:
void lock()
{
while (flag.exchange(true, std::memory_order_acquire));
}
void unlock()
{
flag.store(false, std::memory_order_release);
}
};
edited Nov 14 '18 at 3:32
answered Nov 14 '18 at 3:01
LWimseyLWimsey
3,0501727
3,0501727
add a comment |
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%2f53280739%2fdoes-acquiring-a-spinlock-require-compare-and-swap-or-is-swap-enough%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