---
name: "ck_rwlock"
section: "3"
platform: "linux"
package: "libck-dev"
version: "0.7.2-6"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/ck_rwlock"
---

# ck\_rwlock(3)

centralized write-biased reader-writer locks

## NAME

**ck\_rwlock\_init**, **ck\_rwlock\_write\_lock**, **ck\_rwlock\_write\_unlock**, **ck\_rwlock\_write\_trylock**, **ck\_rwlock\_write\_downgrade**, **ck\_rwlock\_locked\_writer**, **ck\_rwlock\_read\_lock**, **ck\_rwlock\_read\_trylock**, **ck\_rwlock\_read\_unlock**, **ck\_rwlock\_locked\_reader**, **ck\_rwlock\_recursive\_write\_lock**, **ck\_rwlock\_recursive\_write\_trylock**, **ck\_rwlock\_recurisve\_write\_unlock**, **ck\_rwlock\_recursive\_read\_lock**, **ck\_rwlock\_recursive\_read\_trylock**, **ck\_rwlock\_recursive\_read\_unlock** – centralized write-biased reader-writer locks

## LIBRARY

Concurrency Kit (libck, -lck)

## SYNOPSIS

**#include \<ck\_rwlock.h\>**

ck\_rwlock\_t lock = CK\_RWLOCK\_INITIALIZER;

*void*\

**ck\_rwlock\_init**(*ck\_rwlock\_t \*lock*);

*void*\

**ck\_rwlock\_write\_lock**(*ck\_rwlock\_t \*lock*);

*void*\

**ck\_rwlock\_write\_unlock**(*ck\_rwlock\_t \*lock*);

*bool*\

**ck\_rwlock\_write\_trylock**(*ck\_rwlock\_t \*lock*);

*bool*\

**ck\_rwlock\_write\_downgrade**(*ck\_rwlock\_t \*lock*);

*bool*\

**ck\_rwlock\_locked\_writer**(*ck\_rwlock\_t \*lock*);

*void*\

**ck\_rwlock\_read\_lock**(*ck\_rwlock\_t \*lock*);

*bool*\

**ck\_rwlock\_read\_trylock**(*ck\_rwlock\_t \*lock*);

*void*\

**ck\_rwlock\_read\_unlock**(*ck\_rwlock\_t \*lock*);

*bool*\

**ck\_rwlock\_locked\_reader**(*ck\_rwlock\_t \*lock*);

ck\_rwlock\_recursive\_t lock = CK\_RWLOCK\_RECURSIVE\_INITIALIZER;

*void*\

**ck\_rwlock\_recursive\_write\_lock**(*ck\_rwlock\_recursive\_t \*lock*, *unsigned int tid*);

*bool*\

**ck\_rwlock\_recursive\_write\_trylock**(*ck\_rwlock\_recursive\_t \*lock*, *unsigned int tid*);

*void*\

**ck\_rwlock\_recurisve\_write\_unlock**(*ck\_rwlock\_recursive\_t \*lock*);

*void*\

**ck\_rwlock\_recursive\_read\_lock**(*ck\_rwlock\_recursive\_t \*lock*);

*bool*\

**ck\_rwlock\_recursive\_read\_trylock**(*ck\_rwlock\_recursive\_t \*lock*);

*void*\

**ck\_rwlock\_recursive\_read\_unlock**(*ck\_rwlock\_recursive\_t \*lock*);

## DESCRIPTION

This is a centralized write-biased reader-writer lock. It requires very little space overhead and has a low latency fast path. Write-side recursion requires usage of ck\_rwlock\_recursive. Read-side recursion is disallowed. The **ck\_rwlock\_write\_downgrade**() function degrades the caller's write-side acquisition to a read-side acquisition without forfeit of current critical section.

## EXAMPLE

```
#include <ck_rwlock.h>
static ck_rwlock_t lock = CK_RWLOCK_INITIALIZER;
static void
reader(void)
{
	for (;;) {
		ck_rwlock_read_lock(&lock);
		/* Read-side critical section. */
		ck_rwlock_read_unlock(&lock);
		if (ck_rwlock_read_trylock(&lock) == true) {
			/* Read-side critical section. */
			ck_rwlock_read_unlock(&lock);
		}
	}
	return;
}
static void
writer(void)
{
	for (;;) {
		ck_rwlock_write_lock(&lock);
		/* Write-side critical section. */
		ck_rwlock_write_unlock(&lock);
		if (ck_rwlock_write_trylock(&lock, 1) == true) {
			/* Write-side critical section. */
			ck_rwlock_write_unlock(&lock);
		}
	}
	return;
}
```

## SEE ALSO

[ck\_brlock(3)](/ck_brlock/3.md), [ck\_elide(3)](/ck_elide/3.md)

Additional information available at http://concurrencykit.org/
