To compile the table example just do:
g++ -Wall -D_REENTRANT -lpthread PadThreads.cpp llist.c table.cpp table_test.cpp \ -o table_test
Note the locking provided by the table class is quite fine grained, allowing threads to traverse tables independently. The following diagram succinctly describes the locking implementation I think.
Note you still have to be aware of lock inversion. I.E. if you have more than 1 table, then threads must lock (acquire) items from the tables in the same order. For e.g...
Table table1, table2; thread1() { table1entry->acquire(); /* try to acquire table2entry */ } thread2() { table2entry->acquire(); /* try to acquire table1entry */ }
The deadlock is obvious here but usually much more subtle in real code. So across threads, don't invert the locking hierarchy.
The following is a UML diagram of the table implementation.