Your SlideShare is downloading. ×
0
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Lock freealgorithms-130724010300-phpapp02
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Lock freealgorithms-130724010300-phpapp02

80

Published on

lock free algo

lock free algo

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
80
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Lock-Free Algorithms Present by PanPan
  • 2. Multi-Thread Programming Problem Read a a=a+1 Calculate a + 1 Save a + 1 Thread A Thread B Read a Read a Calculate a + 1 Save a + 1 Calculate a + 1 Save a + 1 Time
  • 3. Multi-Thread Programming Solution ● Blocking ○ Mutex ○ Critical Section ● Non-Blocking ○ Wait-Free ○ Lock-Free ○ Obstruction-Free ● Local ○ No Shared Data
  • 4. Dead Lock void FunctionA() void FunctionB() Enter Critical Section A Enter Critical Section B Do Something Do Something Dead Lock ll FunctionA Ca Dead Lock Critical Section B Lock Enter Do Something Leave Critical Section B Dead Lock Critical Section A Enter Dead Lock Return (Or Close) Do Something Leave Critical Section A Leave Critical Section B Leave Critical Section A Time
  • 5. What is Lock-Free? A lock-free data structure is one that doesn't use any mutex locks. The implication is that multiple threads can access the data structure concurrently without race conditions or data corruption, even though there are no locks — people would give you funny looks if you suggested that std::list was a lock-free data structure, even though it is unlikely that there are any locks used in the implementation. [1] Non-Blocking Obstruction-Free Lock-Free WaitFree [1] http://www.justsoftwaresolutions.co.uk/threading/non_blocking_lock_free_and_wait_free.html
  • 6. Advantages and Disadvantages ● No "Lock" (Also No Dead Lock) ● Better Performance ● Hard to Implement
  • 7. Main Concept Atom Operation ● Use Atom Operation to Modify Critical Data ● Enter a Spin State When Atom Operation Fail No Success? Yes Finish
  • 8. Compare and Swap bool CAS(uint32* pointer, uint32 old_value, uint32 new_value) { if (*pointer == old_value) { *pointer = new_value; return true; } return false; } InterlockedCompareExchange - Windows API
  • 9. Other Atom Operation ● CAS2 - Compare and Swap 2 ● CASN - Compare and Swap N ● DCAS - Double Compare Swap ● MCAS - Multiword Compare and Swap ● LL/SC - Load Linked / Store Conditional
  • 10. Example - Stack struct Node { volatile Node* next; }; class Stack { volatile Node* head; public: void Push(Node* node); void Pop(); Stack() : head(0) {} }; Something Wrong void Stack::Push(Node* node) { while (true) { node->next = head; if (CAS(&head, node->next, node)) break; } } void Stack::Pop() { while (true) { node* old_head = head; if (head == 0) break; node* next_node = old_head->next; if (CAS(&head, old_head, next_node)) break; } }
  • 11. ABA Problem Threa dA Threa dB Pop Head A B Pop A B A Head C C B C Head Push A Head node* old_head = head; if (head == 0) break; node* next_node = old_head->next; if (CAS(&head, old_head, next_node)) break;
  • 12. Solute ABA Problem ● LL/SC ○ It would return false when target have done a "write" action ● CAS2 ○ Add a versioned value
  • 13. Example - Stack(fix Pop) class Stack { volatile Node* head; volatile int version; public: void Push(Node* node); void Pop(); Stack() : head(0), version(0) {} }; Add Version void Stack:: Pop() { while tru ( e) { Check Version } } node* old_head = head; int old_version = version; if (head == 0) break; node* next_node = old_head->next; if (CAS2(&head, old_head, old_version, next_node, old_version + 1)) break;
  • 14. Summary ● Lock-Free has Better Performance Than Blocking ● Lock-Free has no "Lock" ● Lock-Free is Hard To Implement ● Lock-Free's Spirit - Atom Operation ● Lock-Free's Trap - ABA Problem
  • 15. Notes and References ● Toby Jones - Lock-Free Algorithms(Game Programming Gems 6) ● Jean-Francois Dube - Efficient and Scalable Multi-Core Programming(Game Programming Gems 8) ● Zhou Wei Ming - Multi-core Computing and Programming
  • 16. Any Questions?
  • 17. Thanks for your attention By PanPan 2010-06-29

×