Consider a concurrent linked list with hand-over-hand (lock…

Consider a concurrent linked list with hand-over-hand (lock coupling) locking: each node has its own lock, and a thread traversing the list locks the next node before unlocking the current one. Compared to using a single coarse-grained lock for the entire list, what is the main advantage of this approach?

Consider the following program: int x = 0; void *worker(void…

Consider the following program: int x = 0; void *worker(void *arg) { x = x + 1; return NULL; } int main() { pthread_t t1, t2; pthread_create(&t1, NULL, worker, NULL); pthread_create(&t2, NULL, worker, NULL); pthread_join(t1, NULL); pthread_join(t2, NULL); printf(“%d\n”, x); return 0; } Which of the following best describes the behavior of this program?

For questions 23–24, consider the following code snippet: i…

For questions 23–24, consider the following code snippet: int bytesLeft = MAX_HEAP_SIZE; cond_t c; mutex_t m; void* allocate(int size) { mutex_lock(&m); while (bytesLeft < size) cond_wait(&c, &m); void *ptr = ...; // get mem from heap bytesLeft -= size; mutex_unlock(&m); return ptr; } void free(void *ptr, int size) { mutex_lock(&m); bytesLeft += size; cond_signal(&c); mutex_unlock(&m); }