#include // These tags represent variables protected by the RCU critical section. // The variables are versioned: every version associates each variable with a // value. rcu_data_tag_t tag1; rcu_data_tag_t tag2; void reader() { // Enter the critical section. rcu_reader_enter(); // Get the values corresponding to the latest version this reader observes. rcu_version_t latest = rcu_get_latest_version(); rcu_value_t value1 = rcu_read(tag1, latest); rcu_value_t value2 = rcu_read(tag1, latest); // Use value1 and value2 // Let any writer know that this reader no longer requires this version of // the values. rcu_release_version(latest); // Exit the critical section. rcu_reader_exit(); } void writer() { // Enter the critical section. rcu_writer_enter(); // Create a new version identifier. rcu_version_t old_version = rcu_get_latest_version(); rcu_version_t new_version = rcu_create_version(); // Provide new values for this version. rcu_value_t new_value1 = SOME_VALUE_1; rcu_value_t new_value2 = SOME_VALUE_2; rcu_write(tag1, new_value1, new_version); rcu_write(tag2, new_value2, new_version); // Publish the new version. rcu_set_latest_version(new_version); // Optional: // Wait for readers to stop using the old version and then discard it. rcu_wait_readers(old_version); rcu_remove_version(old_version); // Exit the critical section. rcu_writer_exit(); }