1. No, use() cannot be called with 0 in this setup. Given the setup, memory operations take effect in program order (sequential consistency). The only way for p2() to exit the while (!ready){} loop is to read ready=1, which implies (by sequential consistency) that p2() will read data as 2000. 2. an idiomatic way to do this in C is: int count_nodes(struct list_node* head) { int count; for (count = 0; head; head = head->next, ++count) {} return count; } one could also do: int count_nodes(struct list_node* head) { int count = 0; while (head) { count++; head = head->next; } return count; } 3. b, c