<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Cejohns2</id>
	<title>Expertiza_Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Cejohns2"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Cejohns2"/>
	<updated>2026-05-27T11:41:55Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82613</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82613"/>
		<updated>2013-11-26T04:20:35Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Findings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
This wiki touches on high level synchronization methods across multiple languages and platforms. First it will define the most common of these high level constructs, their purpose, and appropriate use.  Next it will show what languages support these constructs and in what Operating Systems.  Then an example of external libraries providing API's for different types of synchronization will be shown.  Finally a major paper describing some common synchronization methods' performance will be summarized.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt;, also known as &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;. Semaphores have an integer value representing the number of available units of a resource available. The &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; operation attempts to decrement the value of the semaphore (signifying that a thread is taking one of the units) but will only succeed if the value is greater than 0. This makes sense since it would be impossible for there to be a negative number of units of a resource available. The &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt; operation increments the value of the semaphore, signifying that the thread has freed its resource.&lt;br /&gt;
&lt;br /&gt;
There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. Mutexes are essentially binary semaphores with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following pseudocode shows an implementation of &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''function''' acquire(semaphore S):&lt;br /&gt;
    [S ← S + 1]&lt;br /&gt;
  &lt;br /&gt;
  '''function''' release(semaphore S):&lt;br /&gt;
    repeat:&lt;br /&gt;
      [if S &amp;gt;= 0:&lt;br /&gt;
          S ← S - 1&lt;br /&gt;
          break]&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; keyword which functions in much the same way. All code within a &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; method or &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; statement is executed with mutual exclusion.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
For Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword is required for every method that needs to be synchronized. In the C# example, the locking actually takes place within the functions, meaning multiple threads could be accessing the same function at the same time, just not that piece of code within the &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
The following example shows an example of a Monitor class using Java-like syntax.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''monitor class''' ''Account'' {&lt;br /&gt;
   '''private''' ''int'' balance := 0&lt;br /&gt;
   '''invariant''' balance &amp;gt;= 0&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' ''boolean'' withdraw(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     '''if''' balance &amp;lt; amount '''then''' '''return false'''&lt;br /&gt;
     '''else''' { balance := balance - amount ; '''return true''' }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' deposit(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     balance := balance + amount&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Notice that there is no use of locks, &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; statements, or any other explicit synchronization code other than the &amp;lt;code&amp;gt;'''monitor'''&amp;lt;/code&amp;gt; keyword. By definition, all the methods in the class are executed with mutual exclusion, removing the need to deal with synchronization independently.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows the major well known native synchronization methods for some popular languages and what OS they are supported in.  Mostly if there is a compiler for that language in an OS it supports all its features.  Some synchronization types have been grouped together due to how similar they perform, such as the Semaphore and Mutex.  Others such as Condition Variables are grouped with Monitors because they extend the same abilities to a language. This list is not comprehensive, for instance Java has Classes to support almost every synchronization method even though they are mostly all simulated and not truly atomic at the hardware level.  The OS support key is as follows:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''Windows, Linux, &amp;amp; Mac'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Native Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor/Cond. Var !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;sync_php&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Perl&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|flock&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This table is an example of some external libraries that provide an API for synchronization, thread support, or some type of parallelization specialization.  It is by no means exhaustive and is simply meant to give some example and show the diversity of possible libraries.  OpenMP uses compiler directives called pragmas to divide a program into threads accordingly and includes support for synchronization techniques such as barriers, critical section declarations, and synchronization constructs.  PaStiX is an API specifically for parallelizing direct solving methods of sparse matrices.  Intel TBB is the Thread Building Blocks library meant specifically for maximizing the use of mulit-core processors by means of task stealing.  RubySync is an open source project that is on a much higher level than the others here, it is meant for synchronization across databases.  &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ External Synchronization Support&lt;br /&gt;
!Language !! OpenMP&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt; !! PaStiX&amp;lt;ref name=&amp;quot;pastix&amp;quot;/&amp;gt; !! Intel TBB !! RubySync&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;rubysync&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Study on the Behavior of Synchronization Methods [...]==&lt;br /&gt;
===Introduction===&lt;br /&gt;
There was a study in 2013 by the Computer Science and Engineering department at Chalmers University of Technology entitled: &amp;lt;b&amp;gt;A Study on the Behavior of Synchronization Methods in Commonly Used Languages and Systems&amp;lt;/b&amp;gt;&amp;lt;ref name=&amp;quot;cederman&amp;quot;/&amp;gt;, by Cederman et al.  This paper analyzed the throughput and fairness of different lock methods across two architectures and three languages.  Most benchmarks focus on throughput because this is a rough measurement of the 'speed' in terms of how much processing can be completed in a given amount of time.  However the methods with the highest throughput usually have the lowest fairness, meaning they tend to starve one or more threads.  This aspect is largely overlooked in synchronization methods and this paper addresses this issue.  It uses a scale where 1 means all threads received equal work and 0 means at least one thread starved completely.  They also measure synchronization across three different approaches: fine grain, coarse grain, and lock-free.  These are implemented differently for the two tests that were perfomed: accessing a global FIFO queue, and modifying a global chained hash table.  Finally, these tests were performed on two different architectures, Intel Nehalem and AMD Bulldozer, with the languages C++, Java, and C# (.NET and Mono).&lt;br /&gt;
&lt;br /&gt;
===Findings===&lt;br /&gt;
&lt;br /&gt;
The results of the study appear in the graphs below. For throughput, note that the vertical axes do not represent the same ranges of values.&lt;br /&gt;
&lt;br /&gt;
[[Image:cederman_queues.jpg|center|alt=Queue Results]]&lt;br /&gt;
[[Image:cederman_hashTs.jpg|center|alt=Hash Table Results]]&lt;br /&gt;
&lt;br /&gt;
===Conclusions===&lt;br /&gt;
As can be seen, some synchronization methods perform much better for some jobs in some languages.  For C++ it can be seen that lock-free methods outperform everything else for hash table access (Figure 4), and while lock-free was a top performer for C# and Java it was not the clear winner.  Also to note, for the hash table throughput graphs the scale of the C++ throughput access is much higher than all the others.  In terms of fairness, the lock-free methods are roughly the same as all the other methods.  .NET is the clear loser for fairness across all methods as the number of threads passes 12 it quickly drops off.  &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Looking at throughput for the queues (Figure 1), C#(.NET) had the best throughput up until about 12 threads using TTAS (Test Test and Set), then Java's Reentrant Lock was the winner for 24 threads, then C#(Mono &amp;amp; .Net) have the best throughput for queue access using TTAS.  In C++ most of the methods performed more or less equivalently, with TTAS staying near the top most of the time.  Interestingly every method decreased in throughput with the addition of more threads except Java's Reentrant Lock and C# (Mono)'s TTAS.  They both grew out until 24 threads.  So Java's Reentrant Lock and C#'s TTAS are good choices for synchronization of a FIFO Queue.  In terms of fairness all the methods in all languages dropped off drastically after 24 threads.  In C++ TTAS, Array Lock, &amp;amp; TAS dropped to starvation levels.  In Java all methods dropped low except the Reentrant Fair lock, which seems logical.  That lock had the worst throughput performance by far though, so it does not seem to be a good trade.  In C# the TTAS dropped off on par with the other methods, with .NET being worse for starvation with more threads than Mono.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;&amp;gt;[http://effbot.org/zone/thread-synchronization.htm Python: ReLocks, Mutex, Cond. Vars]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;&amp;gt;[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html Reentrant Lock (Java)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/mutex/mutex/?kw=mutex C Mutex]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/condition_variable/condition_variable/ C Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;&amp;gt;[http://ruby-doc.org/stdlib-1.9.3/libdoc/thread/rdoc/ConditionVariable.html Ruby Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;sync_php&amp;quot;&amp;gt;[http://www.php.net/manual/en/thread.synchronized.php PHP Synchronized]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/perlthrtut.html Perl: Mutex, Cond. Var]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/functions/flock.html Perl flock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pastix&amp;quot;&amp;gt;[http://pastix.gforge.inria.fr/files/README-txt.html PaStiX]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;rubysync&amp;quot;&amp;gt;[http://www.ohloh.net/p/rubysync RubySync]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cederman&amp;quot;&amp;gt;[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82612</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82612"/>
		<updated>2013-11-26T04:13:58Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
This wiki touches on high level synchronization methods across multiple languages and platforms. First it will define the most common of these high level constructs, their purpose, and appropriate use.  Next it will show what languages support these constructs and in what Operating Systems.  Then an example of external libraries providing API's for different types of synchronization will be shown.  Finally a major paper describing some common synchronization methods' performance will be summarized.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt;, also known as &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;. Semaphores have an integer value representing the number of available units of a resource available. The &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; operation attempts to decrement the value of the semaphore (signifying that a thread is taking one of the units) but will only succeed if the value is greater than 0. This makes sense since it would be impossible for there to be a negative number of units of a resource available. The &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt; operation increments the value of the semaphore, signifying that the thread has freed its resource.&lt;br /&gt;
&lt;br /&gt;
There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. Mutexes are essentially binary semaphores with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following pseudocode shows an implementation of &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''function''' acquire(semaphore S):&lt;br /&gt;
    [S ← S + 1]&lt;br /&gt;
  &lt;br /&gt;
  '''function''' release(semaphore S):&lt;br /&gt;
    repeat:&lt;br /&gt;
      [if S &amp;gt;= 0:&lt;br /&gt;
          S ← S - 1&lt;br /&gt;
          break]&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; keyword which functions in much the same way. All code within a &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; method or &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; statement is executed with mutual exclusion.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
For Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword is required for every method that needs to be synchronized. In the C# example, the locking actually takes place within the functions, meaning multiple threads could be accessing the same function at the same time, just not that piece of code within the &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
The following example shows an example of a Monitor class using Java-like syntax.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''monitor class''' ''Account'' {&lt;br /&gt;
   '''private''' ''int'' balance := 0&lt;br /&gt;
   '''invariant''' balance &amp;gt;= 0&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' ''boolean'' withdraw(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     '''if''' balance &amp;lt; amount '''then''' '''return false'''&lt;br /&gt;
     '''else''' { balance := balance - amount ; '''return true''' }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' deposit(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     balance := balance + amount&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Notice that there is no use of locks, &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; statements, or any other explicit synchronization code other than the &amp;lt;code&amp;gt;'''monitor'''&amp;lt;/code&amp;gt; keyword. By definition, all the methods in the class are executed with mutual exclusion, removing the need to deal with synchronization independently.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows the major well known native synchronization methods for some popular languages and what OS they are supported in.  Mostly if there is a compiler for that language in an OS it supports all its features.  Some synchronization types have been grouped together due to how similar they perform, such as the Semaphore and Mutex.  Others such as Condition Variables are grouped with Monitors because they extend the same abilities to a language. This list is not comprehensive, for instance Java has Classes to support almost every synchronization method even though they are mostly all simulated and not truly atomic at the hardware level.  The OS support key is as follows:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''Windows, Linux, &amp;amp; Mac'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Native Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor/Cond. Var !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;sync_php&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Perl&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|flock&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This table is an example of some external libraries that provide an API for synchronization, thread support, or some type of parallelization specialization.  It is by no means exhaustive and is simply meant to give some example and show the diversity of possible libraries.  OpenMP uses compiler directives called pragmas to divide a program into threads accordingly and includes support for synchronization techniques such as barriers, critical section declarations, and synchronization constructs.  PaStiX is an API specifically for parallelizing direct solving methods of sparse matrices.  Intel TBB is the Thread Building Blocks library meant specifically for maximizing the use of mulit-core processors by means of task stealing.  RubySync is an open source project that is on a much higher level than the others here, it is meant for synchronization across databases.  &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ External Synchronization Support&lt;br /&gt;
!Language !! OpenMP&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt; !! PaStiX&amp;lt;ref name=&amp;quot;pastix&amp;quot;/&amp;gt; !! Intel TBB !! RubySync&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;rubysync&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Study on the Behavior of Synchronization Methods [...]==&lt;br /&gt;
===Introduction===&lt;br /&gt;
There was a study in 2013 by the Computer Science and Engineering department at Chalmers University of Technology entitled: &amp;lt;b&amp;gt;A Study on the Behavior of Synchronization Methods in Commonly Used Languages and Systems&amp;lt;/b&amp;gt;&amp;lt;ref name=&amp;quot;cederman&amp;quot;/&amp;gt;, by Cederman et al.  This paper analyzed the throughput and fairness of different lock methods across two architectures and three languages.  Most benchmarks focus on throughput because this is a rough measurement of the 'speed' in terms of how much processing can be completed in a given amount of time.  However the methods with the highest throughput usually have the lowest fairness, meaning they tend to starve one or more threads.  This aspect is largely overlooked in synchronization methods and this paper addresses this issue.  It uses a scale where 1 means all threads received equal work and 0 means at least one thread starved completely.  They also measure synchronization across three different approaches: fine grain, coarse grain, and lock-free.  These are implemented differently for the two tests that were perfomed: accessing a global FIFO queue, and modifying a global chained hash table.  Finally, these tests were performed on two different architectures, Intel Nehalem and AMD Bulldozer, with the languages C++, Java, and C# (.NET and Mono).&lt;br /&gt;
&lt;br /&gt;
===Findings===&lt;br /&gt;
[[Image:cederman_queues.jpg|center|alt=Queue Results]]&lt;br /&gt;
[[Image:cederman_hashTs.jpg|center|alt=Hash Table Results]]&lt;br /&gt;
&lt;br /&gt;
===Conclusions===&lt;br /&gt;
As can be seen, some synchronization methods perform much better for some jobs in some languages.  For C++ it can be seen that lock-free methods outperform everything else for hash table access (Figure 4), and while lock-free was a top performer for C# and Java it was not the clear winner.  Also to note, for the hash table throughput graphs the scale of the C++ throughput access is much higher than all the others.  In terms of fairness, the lock-free methods are roughly the same as all the other methods.  .NET is the clear loser for fairness across all methods as the number of threads passes 12 it quickly drops off.  &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Looking at throughput for the queues (Figure 1), C#(.NET) had the best throughput up until about 12 threads using TTAS (Test Test and Set), then Java's Reentrant Lock was the winner for 24 threads, then C#(Mono &amp;amp; .Net) have the best throughput for queue access using TTAS.  In C++ most of the methods performed more or less equivalently, with TTAS staying near the top most of the time.  Interestingly every method decreased in throughput with the addition of more threads except Java's Reentrant Lock and C# (Mono)'s TTAS.  They both grew out until 24 threads.  So Java's Reentrant Lock and C#'s TTAS are good choices for synchronization of a FIFO Queue.  In terms of fairness all the methods in all languages dropped off drastically after 24 threads.  In C++ TTAS, Array Lock, &amp;amp; TAS dropped to starvation levels.  In Java all methods dropped low except the Reentrant Fair lock, which seems logical.  That lock had the worst throughput performance by far though, so it does not seem to be a good trade.  In C# the TTAS dropped off on par with the other methods, with .NET being worse for starvation with more threads than Mono.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;&amp;gt;[http://effbot.org/zone/thread-synchronization.htm Python: ReLocks, Mutex, Cond. Vars]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;&amp;gt;[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html Reentrant Lock (Java)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/mutex/mutex/?kw=mutex C Mutex]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/condition_variable/condition_variable/ C Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;&amp;gt;[http://ruby-doc.org/stdlib-1.9.3/libdoc/thread/rdoc/ConditionVariable.html Ruby Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;sync_php&amp;quot;&amp;gt;[http://www.php.net/manual/en/thread.synchronized.php PHP Synchronized]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/perlthrtut.html Perl: Mutex, Cond. Var]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/functions/flock.html Perl flock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pastix&amp;quot;&amp;gt;[http://pastix.gforge.inria.fr/files/README-txt.html PaStiX]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;rubysync&amp;quot;&amp;gt;[http://www.ohloh.net/p/rubysync RubySync]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cederman&amp;quot;&amp;gt;[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82611</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82611"/>
		<updated>2013-11-26T04:13:23Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
This wiki touches on high level synchronization methods across multiple languages and platforms. First it will define the most common of these high level constructs, their purpose, and appropriate use.  Next it will show what languages support these constructs and in what Operating Systems.  Then an example of external libraries providing API's for different types of synchronization will be shown.  Finally a major paper describing some common synchronization methods' performance will be summarized.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt;, also known as &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;. Semaphores have an integer value representing the number of available units of a resource available. The &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; operation attempts to decrement the value of the semaphore (signifying that a thread is taking one of the units) but will only succeed if the value is greater than 0. This makes sense since it would be impossible for there to be a negative number of units of a resource available. The &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt; operation increments the value of the semaphore, signifying that the thread has freed its resource.&lt;br /&gt;
&lt;br /&gt;
There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. Mutexes are essentially binary semaphores with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following pseudocode shows an implementation of &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''function''' acquire(semaphore S):&lt;br /&gt;
    [S ← S + 1]&lt;br /&gt;
  &lt;br /&gt;
  '''function''' release(semaphore S):&lt;br /&gt;
    repeat:&lt;br /&gt;
      [if S &amp;gt;= 0:&lt;br /&gt;
          S ← S - 1&lt;br /&gt;
          break]&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; keyword which functions in much the same way. All code within a &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; method or &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; statement is executed with mutual exclusion.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
For Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword is required for every method that needs to be synchronized. In the C# example, the locking actually takes place within the functions, meaning multiple threads could be accessing the same function at the same time, just not that piece of code within the &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
The following example shows an example of a Monitor class using Java-like syntax.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''monitor class''' ''Account'' {&lt;br /&gt;
   '''private''' ''int'' balance := 0&lt;br /&gt;
   '''invariant''' balance &amp;gt;= 0&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' ''boolean'' withdraw(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     '''if''' balance &amp;lt; amount '''then''' '''return false'''&lt;br /&gt;
     '''else''' { balance := balance - amount ; '''return true''' }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' deposit(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     balance := balance + amount&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Notice that there is no use of locks, &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; statements, or any other explicit synchronization code other than the &amp;lt;code&amp;gt;'''monitor'''&amp;lt;/code&amp;gt; keyword. By definition, all the methods in the class are executed with mutual exclusion, removing the need to deal with synchronization independently.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows the major well known native synchronization methods for some popular languages and what OS they are supported in.  Mostly if there is a compiler for that language in an OS it supports all its features.  Some synchronization types have been grouped together due to how similar they perform, such as the Semaphore and Mutex.  Others such as Condition Variables are grouped with Monitors because they extend the same abilities to a language. This list is not comprehensive, for instance Java has Classes to support almost every synchronization method even though they are mostly all simulated and not truly atomic at the hardware level.  The OS support key is as follows:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''Windows, Linux, &amp;amp; Mac'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Native Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor/Cond. Var !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;sync_php&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Perl&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|flock&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This table is an example of some external libraries that provide an API for synchronization, thread support, or some type of parallelization specialization.  It is by no means exhaustive and is simply meant to give some example and show the diversity of possible libraries.  OpenMP uses compiler directives called pragmas to divide a program into threads accordingly and includes support for synchronization techniques such as barriers, critical section declarations, and synchronization constructs.  PaStiX is an API specifically for parallelizing direct solving methods of sparse matrices.  Intel TBB is the Thread Building Blocks library meant specifically for maximizing the use of mulit-core processors by means of task stealing.  RubySync is an open source project that is on a much higher level than the others here, it is meant for synchronization across databases.  &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ External Synchronization Support&lt;br /&gt;
!Language !! OpenMP&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt; !! PaStiX&amp;lt;ref name=&amp;quot;pastix&amp;quot;/&amp;gt; !! Intel TBB !! RubySync&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;rubysync&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Study on the Behavior of Synchronization Methods [...]==&lt;br /&gt;
===Introduction===&lt;br /&gt;
There was a study in 2013 by the Computer Science and Engineering department at Chalmers University of Technology entitled: &amp;lt;b&amp;gt;A Study on the Behavior of Synchronization Methods in Commonly Used Languages and Systems&amp;lt;/b&amp;gt;&amp;lt;ref name=&amp;quot;cederman&amp;quot;/&amp;gt;, by Cederman et al.  This paper analyzed the throughput and fairness of different lock methods across two architectures and three languages.  Most benchmarks focus on throughput because this is a rough measurement of the 'speed' in terms of how much processing can be completed in a given amount of time.  However the methods with the highest throughput usually have the lowest fairness, meaning they tend to starve one or more threads.  This aspect is largely overlooked in synchronization methods and this paper addresses this issue.  It uses a scale where 1 means all threads received equal work and 0 means at least one thread starved completely.  They also measure synchronization across three different approaches: fine grain, coarse grain, and lock-free.  These are implemented differently for the two tests that were perfomed: accessing a global FIFO queue, and modifying a global chained hash table.  Finally, these tests were performed on two different architectures, Intel Nehalem and AMD Bulldozer, with the languages C++, Java, &amp;amp; C# (.NET &amp;amp; Mono).&lt;br /&gt;
&lt;br /&gt;
===Findings===&lt;br /&gt;
[[Image:cederman_queues.jpg|center|alt=Queue Results]]&lt;br /&gt;
[[Image:cederman_hashTs.jpg|center|alt=Hash Table Results]]&lt;br /&gt;
&lt;br /&gt;
===Conclusions===&lt;br /&gt;
As can be seen, some synchronization methods perform much better for some jobs in some languages.  For C++ it can be seen that lock-free methods outperform everything else for hash table access (Figure 4), and while lock-free was a top performer for C# and Java it was not the clear winner.  Also to note, for the hash table throughput graphs the scale of the C++ throughput access is much higher than all the others.  In terms of fairness, the lock-free methods are roughly the same as all the other methods.  .NET is the clear loser for fairness across all methods as the number of threads passes 12 it quickly drops off.  &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Looking at throughput for the queues (Figure 1), C#(.NET) had the best throughput up until about 12 threads using TTAS (Test Test and Set), then Java's Reentrant Lock was the winner for 24 threads, then C#(Mono &amp;amp; .Net) have the best throughput for queue access using TTAS.  In C++ most of the methods performed more or less equivalently, with TTAS staying near the top most of the time.  Interestingly every method decreased in throughput with the addition of more threads except Java's Reentrant Lock and C# (Mono)'s TTAS.  They both grew out until 24 threads.  So Java's Reentrant Lock and C#'s TTAS are good choices for synchronization of a FIFO Queue.  In terms of fairness all the methods in all languages dropped off drastically after 24 threads.  In C++ TTAS, Array Lock, &amp;amp; TAS dropped to starvation levels.  In Java all methods dropped low except the Reentrant Fair lock, which seems logical.  That lock had the worst throughput performance by far though, so it does not seem to be a good trade.  In C# the TTAS dropped off on par with the other methods, with .NET being worse for starvation with more threads than Mono.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;&amp;gt;[http://effbot.org/zone/thread-synchronization.htm Python: ReLocks, Mutex, Cond. Vars]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;&amp;gt;[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html Reentrant Lock (Java)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/mutex/mutex/?kw=mutex C Mutex]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/condition_variable/condition_variable/ C Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;&amp;gt;[http://ruby-doc.org/stdlib-1.9.3/libdoc/thread/rdoc/ConditionVariable.html Ruby Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;sync_php&amp;quot;&amp;gt;[http://www.php.net/manual/en/thread.synchronized.php PHP Synchronized]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/perlthrtut.html Perl: Mutex, Cond. Var]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/functions/flock.html Perl flock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pastix&amp;quot;&amp;gt;[http://pastix.gforge.inria.fr/files/README-txt.html PaStiX]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;rubysync&amp;quot;&amp;gt;[http://www.ohloh.net/p/rubysync RubySync]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cederman&amp;quot;&amp;gt;[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82608</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82608"/>
		<updated>2013-11-26T03:56:53Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Synchronized */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
This wiki touches on high level synchronization methods across multiple languages and platforms. First it will define the most common of these high level constructs, their purpose, and appropriate use.  Next it will show what languages support these constructs and in what Operating Systems.  Then an example of external libraries providing API's for different types of synchronization will be shown.  Finally a major paper describing some common synchronization methods' performance will be summarized.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt;, also known as &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;. Semaphores have an integer value representing the number of available units of a resource available. The &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; operation attempts to decrement the value of the semaphore (signifying that a thread is taking one of the units) but will only succeed if the value is greater than 0. This makes sense since it would be impossible for there to be a negative number of units of a resource available. The &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt; operation increments the value of the semaphore, signifying that the thread has freed its resource.&lt;br /&gt;
&lt;br /&gt;
There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. Mutexes are essentially binary semaphores with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following pseudocode shows an implementation of &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''function''' acquire(semaphore S):&lt;br /&gt;
    [S ← S + 1]&lt;br /&gt;
  &lt;br /&gt;
  '''function''' release(semaphore S):&lt;br /&gt;
    repeat:&lt;br /&gt;
      [if S &amp;gt;= 0:&lt;br /&gt;
          S ← S - 1&lt;br /&gt;
          break]&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; keyword which functions in much the same way. All code within a &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; method or &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; statement is executed with mutual exclusion.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
For Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword is required for every method that needs to be synchronized. In the C# example, the locking actually takes place within the functions, meaning multiple threads could be accessing the same function at the same time, just not that piece of code within the &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
The following example shows an example of a Monitor class using Java-like syntax.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''monitor class''' ''Account'' {&lt;br /&gt;
   '''private''' ''int'' balance := 0&lt;br /&gt;
   '''invariant''' balance &amp;gt;= 0&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' ''boolean'' withdraw(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     '''if''' balance &amp;lt; amount '''then''' '''return false'''&lt;br /&gt;
     '''else''' { balance := balance - amount ; '''return true''' }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' deposit(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     balance := balance + amount&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Notice that there is no use of locks, &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; statements, or any other explicit synchronization code other than the &amp;lt;code&amp;gt;'''monitor'''&amp;lt;/code&amp;gt; keyword. By definition, all the methods in the class are executed with mutual exclusion, removing the need to deal with synchronization independently.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows the major well known native synchronization methods for some popular languages and what OS they are supported in.  Mostly if there is a compiler for that language in an OS it supports all its features.  Some synchronization types have been grouped together due to how similar they perform, such as the Semaphore and Mutex.  Others such as Condition Variables are grouped with Monitors because they extend the same abilities to a language. This list is not comprehensive, for instance Java has Classes to support almost every synchronization method even though they are mostly all simulated and not truly atomic at the hardware level.  The OS support key is as follows:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''Windows, Linux, &amp;amp; Mac'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Native Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor/Cond. Var !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;sync_php&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Perl&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|flock&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This table is an example of some external libraries that provide an API for synchronization, thread support, or some type of parallelization specialization.  It is by no means exhaustive and is simply meant to give some example and show the diversity of possible libraries.  OpenMP uses compiler directives called pragmas to divide a program into threads accordingly and includes support for synchronization techniques such as barriers, critical section declarations, and synchronization constructs.  PaStiX is an API specifically for parallelizing direct solving methods of sparse matrices.  Intel TBB is the Thread Building Blocks library meant specifically for maximizing the use of mulit-core processors by means of task stealing.  RubySync is an open source project that is on a much higher level than the others here, it is meant for synchronization across databases.  &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ External Synchronization Support&lt;br /&gt;
!Language !! OpenMP&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt; !! PaStiX&amp;lt;ref name=&amp;quot;pastix&amp;quot;/&amp;gt; !! Intel TBB !! RubySync&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;rubysync&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Study on the Behavior of Synchronization Methods [...]==&lt;br /&gt;
===Introduction===&lt;br /&gt;
There was a study in 2013 by the Computer Science and Engineering department at Chalmers University of Technology entitled: &amp;lt;b&amp;gt;A Study on the Behavior of Synchronization Methods in Commonly Used Languages and Systems&amp;lt;/b&amp;gt;&amp;lt;ref name=&amp;quot;cederman&amp;quot;/&amp;gt;, by Cederman et al.  This paper analyzed the throughput and fairness of different lock methods across two architectures and three languages.  Most benchmarks focus on throughput because this is a rough measurement of the 'speed' in terms of how much processing can be completed in a given amount of time.  However the methods with the highest throughput usually have the lowest fairness, meaning they tend to starve one or more threads.  This aspect is largely overlooked in synchronization methods and this paper addresses this issue.  It uses a scale where 1 means all threads received equal work and 0 means at least one thread starved completely.  They also measure synchronization across three different approaches: fine grain, coarse grain, and lock-free.  These are implemented differently for the two tests that were perfomed, accessing a global FIFO queue, and modifying a global chained hash table.  Finally these tests were performed on two different architectures, the Intel Nehalem and AMD Bulldozer with the languages C++, Java, &amp;amp; C# (.NET &amp;amp; Mono).&lt;br /&gt;
&lt;br /&gt;
===Findings===&lt;br /&gt;
[[Image:cederman_queues.jpg|center|alt=Queue Results]]&lt;br /&gt;
[[Image:cederman_hashTs.jpg|center|alt=Hash Table Results]]&lt;br /&gt;
&lt;br /&gt;
===Conclusions===&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;&amp;gt;[http://effbot.org/zone/thread-synchronization.htm Python: ReLocks, Mutex, Cond. Vars]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;&amp;gt;[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html Reentrant Lock (Java)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/mutex/mutex/?kw=mutex C Mutex]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/condition_variable/condition_variable/ C Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;&amp;gt;[http://ruby-doc.org/stdlib-1.9.3/libdoc/thread/rdoc/ConditionVariable.html Ruby Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;sync_php&amp;quot;&amp;gt;[http://www.php.net/manual/en/thread.synchronized.php PHP Synchronized]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/perlthrtut.html Perl: Mutex, Cond. Var]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/functions/flock.html Perl flock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pastix&amp;quot;&amp;gt;[http://pastix.gforge.inria.fr/files/README-txt.html PaStiX]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;rubysync&amp;quot;&amp;gt;[http://www.ohloh.net/p/rubysync RubySync]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cederman&amp;quot;&amp;gt;[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
&lt;br /&gt;
HEY CHRIS!!!!&lt;br /&gt;
-&amp;gt;FYI: i figured out a good idea for the table, split it into 2, 1 table being native synchros, the second being certain libraries for synchro that support that language, i.e. OpenMP would be for the second table.  Also, I'll implement that since it was my idea.  Also I should be done filling in my portions by sometime Friday night [11/22].&lt;br /&gt;
&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Koala.jpg]]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82607</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82607"/>
		<updated>2013-11-26T03:54:29Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Semaphores and Mutexes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
This wiki touches on high level synchronization methods across multiple languages and platforms. First it will define the most common of these high level constructs, their purpose, and appropriate use.  Next it will show what languages support these constructs and in what Operating Systems.  Then an example of external libraries providing API's for different types of synchronization will be shown.  Finally a major paper describing some common synchronization methods' performance will be summarized.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt;, also known as &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;. Semaphores have an integer value representing the number of available units of a resource available. The &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; operation attempts to decrement the value of the semaphore (signifying that a thread is taking one of the units) but will only succeed if the value is greater than 0. This makes sense since it would be impossible for there to be a negative number of units of a resource available. The &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt; operation increments the value of the semaphore, signifying that the thread has freed its resource.&lt;br /&gt;
&lt;br /&gt;
There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. Mutexes are essentially binary semaphores with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following pseudocode shows an implementation of &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''function''' acquire(semaphore S):&lt;br /&gt;
    [S ← S + 1]&lt;br /&gt;
  &lt;br /&gt;
  '''function''' release(semaphore S):&lt;br /&gt;
    repeat:&lt;br /&gt;
      [if S &amp;gt;= 0:&lt;br /&gt;
          S ← S - 1&lt;br /&gt;
          break]&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
For Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword is required for every method that needs to be synchronized. In the C# example, the locking actually takes place within the functions, meaning multiple threads could be accessing the same function at the same time, just not that piece of code within the &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
The following example shows an example of a Monitor class using Java-like syntax.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''monitor class''' ''Account'' {&lt;br /&gt;
   '''private''' ''int'' balance := 0&lt;br /&gt;
   '''invariant''' balance &amp;gt;= 0&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' ''boolean'' withdraw(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     '''if''' balance &amp;lt; amount '''then''' '''return false'''&lt;br /&gt;
     '''else''' { balance := balance - amount ; '''return true''' }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' deposit(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     balance := balance + amount&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Notice that there is no use of locks, &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; statements, or any other explicit synchronization code other than the &amp;lt;code&amp;gt;'''monitor'''&amp;lt;/code&amp;gt; keyword. By definition, all the methods in the class are executed with mutual exclusion, removing the need to deal with synchronization independently.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows the major well known native synchronization methods for some popular languages and what OS they are supported in.  Mostly if there is a compiler for that language in an OS it supports all its features.  Some synchronization types have been grouped together due to how similar they perform, such as the Semaphore and Mutex.  Others such as Condition Variables are grouped with Monitors because they extend the same abilities to a language. This list is not comprehensive, for instance Java has Classes to support almost every synchronization method even though they are mostly all simulated and not truly atomic at the hardware level.  The OS support key is as follows:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''Windows, Linux, &amp;amp; Mac'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Native Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor/Cond. Var !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;sync_php&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Perl&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|flock&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This table is an example of some external libraries that provide an API for synchronization, thread support, or some type of parallelization specialization.  It is by no means exhaustive and is simply meant to give some example and show the diversity of possible libraries.  OpenMP uses compiler directives called pragmas to divide a program into threads accordingly and includes support for synchronization techniques such as barriers, critical section declarations, and synchronization constructs.  PaStiX is an API specifically for parallelizing direct solving methods of sparse matrices.  Intel TBB is the Thread Building Blocks library meant specifically for maximizing the use of mulit-core processors by means of task stealing.  RubySync is an open source project that is on a much higher level than the others here, it is meant for synchronization across databases.  &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ External Synchronization Support&lt;br /&gt;
!Language !! OpenMP&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt; !! PaStiX&amp;lt;ref name=&amp;quot;pastix&amp;quot;/&amp;gt; !! Intel TBB !! RubySync&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;rubysync&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Study on the Behavior of Synchronization Methods [...]==&lt;br /&gt;
===Introduction===&lt;br /&gt;
There was a study in 2013 by the Computer Science and Engineering department at Chalmers University of Technology entitled: &amp;lt;b&amp;gt;A Study on the Behavior of Synchronization Methods in Commonly Used Languages and Systems&amp;lt;/b&amp;gt;&amp;lt;ref name=&amp;quot;cederman&amp;quot;/&amp;gt;, by Cederman et al.  This paper analyzed the throughput and fairness of different lock methods across two architectures and three languages.  Most benchmarks focus on throughput because this is a rough measurement of the 'speed' in terms of how much processing can be completed in a given amount of time.  However the methods with the highest throughput usually have the lowest fairness, meaning they tend to starve one or more threads.  This aspect is largely overlooked in synchronization methods and this paper addresses this issue.  It uses a scale where 1 means all threads received equal work and 0 means at least one thread starved completely.  They also measure synchronization across three different approaches: fine grain, coarse grain, and lock-free.  These are implemented differently for the two tests that were perfomed, accessing a global FIFO queue, and modifying a global chained hash table.  Finally these tests were performed on two different architectures, the Intel Nehalem and AMD Bulldozer with the languages C++, Java, &amp;amp; C# (.NET &amp;amp; Mono).&lt;br /&gt;
&lt;br /&gt;
===Findings===&lt;br /&gt;
[[Image:cederman_queues.jpg|center|alt=Queue Results]]&lt;br /&gt;
[[Image:cederman_hashTs.jpg|center|alt=Hash Table Results]]&lt;br /&gt;
&lt;br /&gt;
===Conclusions===&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;&amp;gt;[http://effbot.org/zone/thread-synchronization.htm Python: ReLocks, Mutex, Cond. Vars]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;&amp;gt;[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html Reentrant Lock (Java)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/mutex/mutex/?kw=mutex C Mutex]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/condition_variable/condition_variable/ C Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;&amp;gt;[http://ruby-doc.org/stdlib-1.9.3/libdoc/thread/rdoc/ConditionVariable.html Ruby Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;sync_php&amp;quot;&amp;gt;[http://www.php.net/manual/en/thread.synchronized.php PHP Synchronized]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/perlthrtut.html Perl: Mutex, Cond. Var]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/functions/flock.html Perl flock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pastix&amp;quot;&amp;gt;[http://pastix.gforge.inria.fr/files/README-txt.html PaStiX]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;rubysync&amp;quot;&amp;gt;[http://www.ohloh.net/p/rubysync RubySync]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cederman&amp;quot;&amp;gt;[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
&lt;br /&gt;
HEY CHRIS!!!!&lt;br /&gt;
-&amp;gt;FYI: i figured out a good idea for the table, split it into 2, 1 table being native synchros, the second being certain libraries for synchro that support that language, i.e. OpenMP would be for the second table.  Also, I'll implement that since it was my idea.  Also I should be done filling in my portions by sometime Friday night [11/22].&lt;br /&gt;
&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Koala.jpg]]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82606</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82606"/>
		<updated>2013-11-26T03:50:58Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Types of Synchronization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
This wiki touches on high level synchronization methods across multiple languages and platforms. First it will define the most common of these high level constructs, their purpose, and appropriate use.  Next it will show what languages support these constructs and in what Operating Systems.  Then an example of external libraries providing API's for different types of synchronization will be shown.  Finally a major paper describing some common synchronization methods' performance will be summarized.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt;, also known as &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;. Semaphores have an integer value representing the number of available units of a resource available. The &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; operation attempts to decrement the value of the semaphore (signifying that a thread is taking one of the units) but will only succeed if the value is greater than 0. This makes sense since it would be impossible for there to be a negative number of units of a resource to be available. The &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt; operation increments the value of the semaphore, signifying that the thread has freed its resource.&lt;br /&gt;
&lt;br /&gt;
There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. Mutexes are essentially binary semaphores with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following pseudocode shows an implementation of &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''function''' acquire(semaphore S):&lt;br /&gt;
    [S ← S + 1]&lt;br /&gt;
  &lt;br /&gt;
  '''function''' release(semaphore S):&lt;br /&gt;
    repeat:&lt;br /&gt;
      [if S &amp;gt;= 0:&lt;br /&gt;
          S ← S - 1&lt;br /&gt;
          break]&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
For Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword is required for every method that needs to be synchronized. In the C# example, the locking actually takes place within the functions, meaning multiple threads could be accessing the same function at the same time, just not that piece of code within the &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
The following example shows an example of a Monitor class using Java-like syntax.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''monitor class''' ''Account'' {&lt;br /&gt;
   '''private''' ''int'' balance := 0&lt;br /&gt;
   '''invariant''' balance &amp;gt;= 0&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' ''boolean'' withdraw(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     '''if''' balance &amp;lt; amount '''then''' '''return false'''&lt;br /&gt;
     '''else''' { balance := balance - amount ; '''return true''' }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' deposit(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     balance := balance + amount&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Notice that there is no use of locks, &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; statements, or any other explicit synchronization code other than the &amp;lt;code&amp;gt;'''monitor'''&amp;lt;/code&amp;gt; keyword. By definition, all the methods in the class are executed with mutual exclusion, removing the need to deal with synchronization independently.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows the major well known native synchronization methods for some popular languages and what OS they are supported in.  Mostly if there is a compiler for that language in an OS it supports all its features.  Some synchronization types have been grouped together due to how similar they perform, such as the Semaphore and Mutex.  Others such as Condition Variables are grouped with Monitors because they extend the same abilities to a language. This list is not comprehensive, for instance Java has Classes to support almost every synchronization method even though they are mostly all simulated and not truly atomic at the hardware level.  The OS support key is as follows:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''Windows, Linux, &amp;amp; Mac'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Native Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor/Cond. Var !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;sync_php&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Perl&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|flock&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This table is an example of some external libraries that provide an API for synchronization, thread support, or some type of parallelization specialization.  It is by no means exhaustive and is simply meant to give some example and show the diversity of possible libraries.  OpenMP uses compiler directives called pragmas to divide a program into threads accordingly and includes support for synchronization techniques such as barriers, critical section declarations, and synchronization constructs.  PaStiX is an API specifically for parallelizing direct solving methods of sparse matrices.  Intel TBB is the Thread Building Blocks library meant specifically for maximizing the use of mulit-core processors by means of task stealing.  RubySync is an open source project that is on a much higher level than the others here, it is meant for synchronization across databases.  &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ External Synchronization Support&lt;br /&gt;
!Language !! OpenMP&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt; !! PaStiX&amp;lt;ref name=&amp;quot;pastix&amp;quot;/&amp;gt; !! Intel TBB !! RubySync&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;rubysync&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Study on the Behavior of Synchronization Methods [...]==&lt;br /&gt;
===Introduction===&lt;br /&gt;
There was a study in 2013 by the Computer Science and Engineering department at Chalmers University of Technology entitled: &amp;lt;b&amp;gt;A Study on the Behavior of Synchronization Methods in Commonly Used Languages and Systems&amp;lt;/b&amp;gt;&amp;lt;ref name=&amp;quot;cederman&amp;quot;/&amp;gt;, by Cederman et al.  This paper analyzed the throughput and fairness of different lock methods across two architectures and three languages.  Most benchmarks focus on throughput because this is a rough measurement of the 'speed' in terms of how much processing can be completed in a given amount of time.  However the methods with the highest throughput usually have the lowest fairness, meaning they tend to starve one or more threads.  This aspect is largely overlooked in synchronization methods and this paper addresses this issue.  It uses a scale where 1 means all threads received equal work and 0 means at least one thread starved completely.  They also measure synchronization across three different approaches: fine grain, coarse grain, and lock-free.  These are implemented differently for the two tests that were perfomed, accessing a global FIFO queue, and modifying a global chained hash table.  Finally these tests were performed on two different architectures, the Intel Nehalem and AMD Bulldozer with the languages C++, Java, &amp;amp; C# (.NET &amp;amp; Mono).&lt;br /&gt;
&lt;br /&gt;
===Findings===&lt;br /&gt;
[[Image:cederman_queues.jpg|center|alt=Queue Results]]&lt;br /&gt;
[[Image:cederman_hashTs.jpg|center|alt=Hash Table Results]]&lt;br /&gt;
&lt;br /&gt;
===Conclusions===&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;&amp;gt;[http://effbot.org/zone/thread-synchronization.htm Python: ReLocks, Mutex, Cond. Vars]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;&amp;gt;[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html Reentrant Lock (Java)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/mutex/mutex/?kw=mutex C Mutex]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/condition_variable/condition_variable/ C Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;&amp;gt;[http://ruby-doc.org/stdlib-1.9.3/libdoc/thread/rdoc/ConditionVariable.html Ruby Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;sync_php&amp;quot;&amp;gt;[http://www.php.net/manual/en/thread.synchronized.php PHP Synchronized]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/perlthrtut.html Perl: Mutex, Cond. Var]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/functions/flock.html Perl flock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pastix&amp;quot;&amp;gt;[http://pastix.gforge.inria.fr/files/README-txt.html PaStiX]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;rubysync&amp;quot;&amp;gt;[http://www.ohloh.net/p/rubysync RubySync]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cederman&amp;quot;&amp;gt;[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
&lt;br /&gt;
HEY CHRIS!!!!&lt;br /&gt;
-&amp;gt;FYI: i figured out a good idea for the table, split it into 2, 1 table being native synchros, the second being certain libraries for synchro that support that language, i.e. OpenMP would be for the second table.  Also, I'll implement that since it was my idea.  Also I should be done filling in my portions by sometime Friday night [11/22].&lt;br /&gt;
&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Koala.jpg]]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82605</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82605"/>
		<updated>2013-11-26T03:45:56Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Monitors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
This wiki touches on high level synchronization methods across multiple languages and platforms. First it will define the most common of these high level constructs, their purpose, and appropriate use.  Next it will show what languages support these constructs and in what Operating Systems.  Then an example of external libraries providing API's for different types of synchronization will be shown.  Finally a major paper describing some common synchronization methods' performance will be summarized.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt;, also known as &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;. Semaphores have an integer value representing the number of available units of a resource available. The &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; operation attempts to decrement the value of the semaphore (signifying that a thread is taking one of the units) but will only succeed if the value is greater than 0. This makes sense since it would be impossible for there to be a negative number of units of a resource to be available. The &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt; operation increments the value of the semaphore, signifying that the thread has freed its resource.&lt;br /&gt;
&lt;br /&gt;
There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. Mutexes are essentially binary semaphores with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following pseudocode shows an implementation of &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''function''' acquire(semaphore S):&lt;br /&gt;
    [S ← S + 1]&lt;br /&gt;
  &lt;br /&gt;
  '''function''' release(semaphore S):&lt;br /&gt;
    repeat:&lt;br /&gt;
      [if S &amp;gt;= 0:&lt;br /&gt;
          S ← S - 1&lt;br /&gt;
          break]&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
The following example shows an example of a Monitor class using Java-like syntax.&lt;br /&gt;
&lt;br /&gt;
  '''monitor class''' ''Account'' {&lt;br /&gt;
   '''private''' ''int'' balance := 0&lt;br /&gt;
   '''invariant''' balance &amp;gt;= 0&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' ''boolean'' withdraw(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     '''if''' balance &amp;lt; amount '''then''' '''return false'''&lt;br /&gt;
     '''else''' { balance := balance - amount ; '''return true''' }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''public method''' deposit(''int'' amount)&lt;br /&gt;
      '''precondition''' amount &amp;gt;= 0&lt;br /&gt;
   {&lt;br /&gt;
     balance := balance + amount&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Notice that there is no use of locks, &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; statements, or any other explicit synchronization code other than the &amp;lt;code&amp;gt;'''monitor'''&amp;lt;/code&amp;gt; keyword. By definition, all the methods in the class are executed with mutual exclusion, removing the need to deal with synchronization independently.&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows the major well known native synchronization methods for some popular languages and what OS they are supported in.  Mostly if there is a compiler for that language in an OS it supports all its features.  Some synchronization types have been grouped together due to how similar they perform, such as the Semaphore and Mutex.  Others such as Condition Variables are grouped with Monitors because they extend the same abilities to a language. This list is not comprehensive, for instance Java has Classes to support almost every synchronization method even though they are mostly all simulated and not truly atomic at the hardware level.  The OS support key is as follows:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''Windows, Linux, &amp;amp; Mac'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Native Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor/Cond. Var !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;sync_php&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Perl&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|flock&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This table is an example of some external libraries that provide an API for synchronization, thread support, or some type of parallelization specialization.  It is by no means exhaustive and is simply meant to give some example and show the diversity of possible libraries.  OpenMP uses compiler directives called pragmas to divide a program into threads accordingly and includes support for synchronization techniques such as barriers, critical section declarations, and synchronization constructs.  PaStiX is an API specifically for parallelizing direct solving methods of sparse matrices.  Intel TBB is the Thread Building Blocks library meant specifically for maximizing the use of mulit-core processors by means of task stealing.  RubySync is an open source project that is on a much higher level than the others here, it is meant for synchronization across databases.  &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ External Synchronization Support&lt;br /&gt;
!Language !! OpenMP&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt; !! PaStiX&amp;lt;ref name=&amp;quot;pastix&amp;quot;/&amp;gt; !! Intel TBB !! RubySync&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;rubysync&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Study on the Behavior of Synchronization Methods [...]==&lt;br /&gt;
===Introduction===&lt;br /&gt;
There was a study in 2013 by the Computer Science and Engineering department at Chalmers University of Technology entitled: &amp;lt;b&amp;gt;A Study on the Behavior of Synchronization Methods in Commonly Used Languages and Systems&amp;lt;/b&amp;gt;&amp;lt;ref name=&amp;quot;cederman&amp;quot;/&amp;gt;, by Cederman et al.  This paper analyzed the throughput and fairness of different lock methods across two architectures and three languages.  Most benchmarks focus on throughput because this is a rough measurement of the 'speed' in terms of how much processing can be completed in a given amount of time.  However the methods with the highest throughput usually have the lowest fairness, meaning they tend to starve one or more threads.  This aspect is largely overlooked in synchronization methods and this paper addresses this issue.  It uses a scale where 1 means all threads received equal work and 0 means at least one thread starved completely.  They also measure synchronization across three different approaches: fine grain, coarse grain, and lock-free.  These are implemented differently for the two tests that were perfomed, accessing a global FIFO queue, and modifying a global chained hash table.  Finally these tests were performed on two different architectures, the Intel Nehalem and AMD Bulldozer with the languages C++, Java, &amp;amp; C# (.NET &amp;amp; Mono).&lt;br /&gt;
&lt;br /&gt;
===Findings===&lt;br /&gt;
[[Image:cederman_queues.jpg|center|alt=Queue Results]]&lt;br /&gt;
[[Image:cederman_hashTs.jpg|center|alt=Hash Table Results]]&lt;br /&gt;
&lt;br /&gt;
===Conclusions===&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;&amp;gt;[http://effbot.org/zone/thread-synchronization.htm Python: ReLocks, Mutex, Cond. Vars]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;&amp;gt;[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html Reentrant Lock (Java)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/mutex/mutex/?kw=mutex C Mutex]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/condition_variable/condition_variable/ C Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;&amp;gt;[http://ruby-doc.org/stdlib-1.9.3/libdoc/thread/rdoc/ConditionVariable.html Ruby Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;sync_php&amp;quot;&amp;gt;[http://www.php.net/manual/en/thread.synchronized.php PHP Synchronized]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/perlthrtut.html Perl: Mutex, Cond. Var]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/functions/flock.html Perl flock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pastix&amp;quot;&amp;gt;[http://pastix.gforge.inria.fr/files/README-txt.html PaStiX]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;rubysync&amp;quot;&amp;gt;[http://www.ohloh.net/p/rubysync RubySync]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cederman&amp;quot;&amp;gt;[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
&lt;br /&gt;
HEY CHRIS!!!!&lt;br /&gt;
-&amp;gt;FYI: i figured out a good idea for the table, split it into 2, 1 table being native synchros, the second being certain libraries for synchro that support that language, i.e. OpenMP would be for the second table.  Also, I'll implement that since it was my idea.  Also I should be done filling in my portions by sometime Friday night [11/22].&lt;br /&gt;
&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Koala.jpg]]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82601</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82601"/>
		<updated>2013-11-26T03:38:45Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Ideas (temporary) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
This wiki touches on high level synchronization methods across multiple languages and platforms. First it will define the most common of these high level constructs, their purpose, and appropriate use.  Next it will show what languages support these constructs and in what Operating Systems.  Then an example of external libraries providing API's for different types of synchronization will be shown.  Finally a major paper describing some common synchronization methods' performance will be summarized.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt;, also known as &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;. Semaphores have an integer value representing the number of available units of a resource available. The &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; operation attempts to decrement the value of the semaphore (signifying that a thread is taking one of the units) but will only succeed if the value is greater than 0. This makes sense since it would be impossible for there to be a negative number of units of a resource to be available. The &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt; operation increments the value of the semaphore, signifying that the thread has freed its resource.&lt;br /&gt;
&lt;br /&gt;
There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. Mutexes are essentially binary semaphores with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following pseudocode shows an implementation of &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''function''' acquire(semaphore S):&lt;br /&gt;
    [S ← S + 1]&lt;br /&gt;
  &lt;br /&gt;
  '''function''' release(semaphore S):&lt;br /&gt;
    repeat:&lt;br /&gt;
      [if S &amp;gt;= 0:&lt;br /&gt;
          S ← S - 1&lt;br /&gt;
          break]&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows the major well known native synchronization methods for some popular languages and what OS they are supported in.  Mostly if there is a compiler for that language in an OS it supports all its features.  Some synchronization types have been grouped together due to how similar they perform, such as the Semaphore and Mutex.  Others such as Condition Variables are grouped with Monitors because they extend the same abilities to a language. This list is not comprehensive, for instance Java has Classes to support almost every synchronization method even though they are mostly all simulated and not truly atomic at the hardware level.  The OS support key is as follows:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''Windows, Linux, &amp;amp; Mac'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Native Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor/Cond. Var !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Reentrant Lock&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;sync_php&amp;quot;/&amp;gt;&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
|Perl&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|flock&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000;color:white&amp;quot;|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This table is an example of some external libraries that provide an API for synchronization, thread support, or some type of parallelization specialization.  It is by no means exhaustive and is simply meant to give some example and show the diversity of possible libraries.  OpenMP uses compiler directives called pragmas to divide a program into threads accordingly and includes support for synchronization techniques such as barriers, critical section declarations, and synchronization constructs.  PaStiX is an API specifically for parallelizing direct solving methods of sparse matrices.  Intel TBB is the Thread Building Blocks library meant specifically for maximizing the use of mulit-core processors by means of task stealing.  RubySync is an open source project that is on a much higher level than the others here, it is meant for synchronization across databases.  &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ External Synchronization Support&lt;br /&gt;
!Language !! OpenMP&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt; !! PaStiX&amp;lt;ref name=&amp;quot;pastix&amp;quot;/&amp;gt; !! Intel TBB !! RubySync&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C/C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&amp;lt;ref name=&amp;quot;rubysync&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Study on the Behavior of Synchronization Methods [...]==&lt;br /&gt;
===Introduction===&lt;br /&gt;
There was a study in 2013 by the Computer Science and Engineering department at Chalmers University of Technology entitled: &amp;lt;b&amp;gt;A Study on the Behavior of Synchronization Methods in Commonly Used Languages and Systems&amp;lt;/b&amp;gt;&amp;lt;ref name=&amp;quot;cederman&amp;quot;/&amp;gt;, by Cederman et al.  This paper analyzed the throughput and fairness of different lock methods across two architectures and three languages.  Most benchmarks focus on throughput because this is a rough measurement of the 'speed' in terms of how much processing can be completed in a given amount of time.  However the methods with the highest throughput usually have the lowest fairness, meaning they tend to starve one or more threads.  This aspect is largely overlooked in synchronization methods and this paper addresses this issue.  It uses a scale where 1 means all threads received equal work and 0 means at least one thread starved completely.  They also measure synchronization across three different approaches: fine grain, coarse grain, and lock-free.  These are implemented differently for the two tests that were perfomed, accessing a global FIFO queue, and modifying a global chained hash table.  Finally these tests were performed on two different architectures, the Intel Nehalem and AMD Bulldozer with the languages C++, Java, &amp;amp; C# (.NET &amp;amp; Mono).&lt;br /&gt;
&lt;br /&gt;
===Findings===&lt;br /&gt;
[[Image:cederman_queues.jpg|thumb|center|400px|alt=Queue Results]]&lt;br /&gt;
[[File:cederman_hashTs.jpg|thumb|center|400px|alt=Hash Table Results]]&lt;br /&gt;
&lt;br /&gt;
[[Image:cederman_queuesA.jpg|thumbnail|right|600px|Figure 1&amp;lt;sup&amp;gt;&amp;lt;span id=&amp;quot;4body&amp;quot;&amp;gt;[[#4foot|[4]]]&amp;lt;/span&amp;gt;&amp;lt;/sup&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
===Conclusions===&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_python&amp;quot;&amp;gt;[http://effbot.org/zone/thread-synchronization.htm Python: ReLocks, Mutex, Cond. Vars]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reentrant_java&amp;quot;&amp;gt;[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html Reentrant Lock (Java)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/mutex/mutex/?kw=mutex C Mutex]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_c&amp;quot;&amp;gt;[http://www.cplusplus.com/reference/condition_variable/condition_variable/ C Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_ruby&amp;quot;&amp;gt;[http://ruby-doc.org/stdlib-1.9.3/libdoc/thread/rdoc/ConditionVariable.html Ruby Conditional]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;sync_php&amp;quot;&amp;gt;[http://www.php.net/manual/en/thread.synchronized.php PHP Synchronized]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;conditional_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/perlthrtut.html Perl: Mutex, Cond. Var]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;flock_perl&amp;quot;&amp;gt;[http://perldoc.perl.org/functions/flock.html Perl flock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pastix&amp;quot;&amp;gt;[http://pastix.gforge.inria.fr/files/README-txt.html PaStiX]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;rubysync&amp;quot;&amp;gt;[http://www.ohloh.net/p/rubysync RubySync]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cederman&amp;quot;&amp;gt;[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
&lt;br /&gt;
HEY CHRIS!!!!&lt;br /&gt;
-&amp;gt;FYI: i figured out a good idea for the table, split it into 2, 1 table being native synchros, the second being certain libraries for synchro that support that language, i.e. OpenMP would be for the second table.  Also, I'll implement that since it was my idea.  Also I should be done filling in my portions by sometime Friday night [11/22].&lt;br /&gt;
&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Koala.jpg]]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Koala.jpg&amp;diff=82599</id>
		<title>File:Koala.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Koala.jpg&amp;diff=82599"/>
		<updated>2013-11-26T03:37:38Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: Test. Also, it's a Koala.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Test. Also, it's a Koala.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82522</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82522"/>
		<updated>2013-11-19T17:06:36Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Supported Synchronization in Different Languages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt;, also known as &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;. Semaphores have an integer value representing the number of available units of a resource available. The &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; operation attempts to decrement the value of the semaphore (signifying that a thread is taking one of the units) but will only succeed if the value is greater than 0. This makes sense since it would be impossible for there to be a negative number of units of a resource to be available. The &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt; operation increments the value of the semaphore, signifying that the thread has freed its resource.&lt;br /&gt;
&lt;br /&gt;
There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. Mutexes are essentially binary semaphores with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following pseudocode shows an implementation of &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''function''' acquire(semaphore S):&lt;br /&gt;
    [S ← S + 1]&lt;br /&gt;
  &lt;br /&gt;
  '''function''' release(semaphore S):&lt;br /&gt;
    repeat:&lt;br /&gt;
      [if S &amp;gt;= 0:&lt;br /&gt;
          S ← S - 1&lt;br /&gt;
          break]&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82516</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82516"/>
		<updated>2013-11-19T17:00:29Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Synchronized */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt;, also known as &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;. Semaphores have an integer value representing the number of available units of a resource available. The &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; operation attempts to decrement the value of the semaphore (signifying that a thread is taking one of the units) but will only succeed if the value is greater than 0. This makes sense since it would be impossible for there to be a negative number of units of a resource to be available. The &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt; operation increments the value of the semaphore, signifying that the thread has freed its resource.&lt;br /&gt;
&lt;br /&gt;
There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. Mutexes are essentially binary semaphores with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following pseudocode shows an implementation of &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''function''' acquire(semaphore S):&lt;br /&gt;
    [S ← S + 1]&lt;br /&gt;
  &lt;br /&gt;
  '''function''' release(semaphore S):&lt;br /&gt;
    repeat:&lt;br /&gt;
      [if S &amp;gt;= 0:&lt;br /&gt;
          S ← S - 1&lt;br /&gt;
          break]&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82508</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82508"/>
		<updated>2013-11-19T16:52:35Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Semaphores and Mutexes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt;, also known as &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;. Semaphores have an integer value representing the number of available units of a resource available. The &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; operation attempts to decrement the value of the semaphore (signifying that a thread is taking one of the units) but will only succeed if the value is greater than 0. This makes sense since it would be impossible for there to be a negative number of units of a resource to be available. The &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt; operation increments the value of the semaphore, signifying that the thread has freed its resource.&lt;br /&gt;
&lt;br /&gt;
There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. Mutexes are essentially binary semaphores with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following pseudocode shows an implementation of &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''function''' acquire(semaphore S):&lt;br /&gt;
    [S ← S + 1]&lt;br /&gt;
  &lt;br /&gt;
  '''function''' release(semaphore S):&lt;br /&gt;
    repeat:&lt;br /&gt;
      [if S &amp;gt;= 0:&lt;br /&gt;
          S ← S - 1&lt;br /&gt;
          break]&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;java-synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82500</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82500"/>
		<updated>2013-11-19T16:35:28Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Semaphores and Mutexes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt;, also known as &amp;lt;code&amp;gt;acquire()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;release()&amp;lt;/code&amp;gt;. There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;java-synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82498</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82498"/>
		<updated>2013-11-19T16:34:04Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Synchronized */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, ''wait()'' and ''signal()'', sometimes known as ''acquire()'' and ''release()''. There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt; keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt; keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;java-synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a &amp;lt;code&amp;gt;lock&amp;lt;/code&amp;gt;:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82496</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82496"/>
		<updated>2013-11-19T16:30:39Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Synchronized */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, ''wait()'' and ''signal()'', sometimes known as ''acquire()'' and ''release()''. There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;quot;synchronized&amp;quot; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a lock keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
This Java code shows how its ''synchronized'' keyword can be used to achieve synchronization:&amp;lt;ref name=&amp;quot;java-synchronized&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  public class SynchronizedCounter {&lt;br /&gt;
    private int c = 0;&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void increment() {&lt;br /&gt;
      c++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized void decrement() {&lt;br /&gt;
      c--;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public synchronized int value() {&lt;br /&gt;
      return c;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
The following example in C# shows a high level implementation of a lock:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82495</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82495"/>
		<updated>2013-11-19T16:27:16Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Locks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages--such as C#--have an inherent support for locks, but these implementations are closer to the Java synchronized keyword below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, ''wait()'' and ''signal()'', sometimes known as ''acquire()'' and ''release()''. There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;quot;synchronized&amp;quot; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a lock keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82493</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82493"/>
		<updated>2013-11-19T16:22:34Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Locks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages have an inherent support for locks, such as C#:&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, ''wait()'' and ''signal()'', sometimes known as ''acquire()'' and ''release()''. There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;quot;synchronized&amp;quot; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a lock keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82492</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82492"/>
		<updated>2013-11-19T16:22:10Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Locks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages have an inherent support for locks, such as C#:&lt;br /&gt;
&lt;br /&gt;
  class Account {     // this is a monitor of an account&lt;br /&gt;
    long val = 0;&lt;br /&gt;
    object thisLock = new object();&lt;br /&gt;
    public void Deposit(const long x) {&lt;br /&gt;
      lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
        val += x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    public void Withdraw(const long x) {&lt;br /&gt;
      lock (thisLock) {&lt;br /&gt;
        val -= x;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, ''wait()'' and ''signal()'', sometimes known as ''acquire()'' and ''release()''. There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;quot;synchronized&amp;quot; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a lock keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82490</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82490"/>
		<updated>2013-11-19T16:19:37Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Locks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below. Several languages have an inherent support for locks, such as C#:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=CSharp&amp;gt;&lt;br /&gt;
class Account {     // this is a monitor of an account&lt;br /&gt;
  long val = 0;&lt;br /&gt;
  object thisLock = new object();&lt;br /&gt;
  public void Deposit(const long x) {&lt;br /&gt;
    lock (thisLock) {   // only 1 thread at a time may execute this statement&lt;br /&gt;
      val += x;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public void Withdraw(const long x) {&lt;br /&gt;
    lock (thisLock) {&lt;br /&gt;
      val -= x;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, ''wait()'' and ''signal()'', sometimes known as ''acquire()'' and ''release()''. There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;quot;synchronized&amp;quot; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a lock keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82484</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82484"/>
		<updated>2013-11-19T16:08:16Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Semaphores and Mutexes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, ''wait()'' and ''signal()'', sometimes known as ''acquire()'' and ''release()''. There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;quot;synchronized&amp;quot; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a lock keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82475</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82475"/>
		<updated>2013-11-19T04:40:38Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Supported Synchronization in Different Languages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, wait() and signal(), sometimes known as acquire() and release(). There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;quot;synchronized&amp;quot; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a lock keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82474</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82474"/>
		<updated>2013-11-19T04:38:47Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, wait() and signal(), sometimes known as acquire() and release(). There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;quot;synchronized&amp;quot; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a lock keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
==Ideas (temporary)==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82473</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82473"/>
		<updated>2013-11-19T04:37:39Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, wait() and signal(), sometimes known as acquire() and release(). There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;quot;synchronized&amp;quot; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a lock keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx Slim Reader/Writer Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82472</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82472"/>
		<updated>2013-11-19T04:37:07Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Supported Synchronization in Different Languages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, wait() and signal(), sometimes known as acquire() and release(). There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;quot;synchronized&amp;quot; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a lock keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&amp;lt;ref name=&amp;quot;slimrdwr&amp;quot;/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82471</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82471"/>
		<updated>2013-11-19T04:35:44Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, wait() and signal(), sometimes known as acquire() and release(). There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;quot;synchronized&amp;quot; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a lock keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;semaphore&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Semaphore_(programming) Semaphore]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82470</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82470"/>
		<updated>2013-11-19T04:35:11Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, wait() and signal(), sometimes known as acquire() and release(). There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;quot;synchronized&amp;quot; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a lock keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lock&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Lock_(computer_science) Lock]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;openmp&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/OpenMP OpenMP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synchronized&amp;quot;&amp;gt;[http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html Java Synchronization]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82469</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82469"/>
		<updated>2013-11-19T04:33:11Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Types of Synchronization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, wait() and signal(), sometimes known as acquire() and release(). There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Synchronized===&lt;br /&gt;
In Java, the &amp;quot;synchronized&amp;quot; keyword forces methods or even smaller pieces of code to be executed with mutual exclusion.&amp;lt;ref name=&amp;quot;synchronized&amp;quot;/&amp;gt; C# has a lock keyword which functions in much the same way. Both are similar to the second definition of monitors, but they allow finer grained synchronization.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82468</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82468"/>
		<updated>2013-11-19T04:25:49Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Types of Synchronization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, wait() and signal(), sometimes known as acquire() and release(). There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; In more basic terms, a monitor consists of a mutex and a condition variable. This combination allows threads to try and acquire the mutex, but then allows them to release the monitor and wait on the condition variable if acquisition fails, which helps to prevent deadlock.&lt;br /&gt;
&lt;br /&gt;
A monitor can also be a thread-safe class that's methods are executed with mutual exclusion, allowing the programmer an easier way to implement synchronization.&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt; Java's monitor class for example falls into this second category.&lt;br /&gt;
&lt;br /&gt;
===OpenMP===&lt;br /&gt;
OpenMP is an API (Application Programming Interface) that supports multi-platform shared memory multiprocessing programming in C, C++, and Fortran. OpenMP makes it significantly simpler to parallelize code in supported languages by giving the programmer a set of compiler directives, library routines, and environment variables that influence run-time behavior.&amp;lt;ref name=&amp;quot;openmp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82467</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82467"/>
		<updated>2013-11-19T04:15:43Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Semaphores and Mutexes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, wait() and signal(), sometimes known as acquire() and release(). There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&amp;lt;ref name=&amp;quot;semaphore&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82466</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82466"/>
		<updated>2013-11-19T04:14:57Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Types of Synchronization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
A lock is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.&amp;lt;ref name=&amp;quot;lock&amp;quot;/&amp;gt; There are several different implementations of locks, as well as higher level constructs that use them, which will be briefly examined below.&lt;br /&gt;
&lt;br /&gt;
===Semaphores and Mutexes===&lt;br /&gt;
Semaphores are simple data types used for controlling access to variables. They classically have two operations, wait() and signal(), sometimes known as acquire() and release(). There are two types of semaphores, binary semaphores and counting semaphores. Binary semaphores can only hold a value of 0 or 1, basically meaning that only one thread can access the semaphore at a time. Counting semaphores can have any number of resource instances. A mutex is essentially a binary semaphore with a few extra safety features that make them more desirable to use than plain semaphores.&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82465</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82465"/>
		<updated>2013-11-19T03:59:05Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;monitor&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/Monitor_(synchronization) Monitor (synchronization)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82458</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82458"/>
		<updated>2013-11-14T15:45:28Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Types of Synchronization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Monitors===&lt;br /&gt;
According to Wikipedia, a monitor is &amp;quot;a thread-safe class, object, or module that uses wrapped mutual exclusion in order to transparently safely be used by more than one thread.&amp;quot;&amp;lt;ref name=&amp;quot;monitor&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82455</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82455"/>
		<updated>2013-11-12T20:27:16Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82454</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82454"/>
		<updated>2013-11-12T20:26:26Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods&lt;br /&gt;
in Commonly Used Languages and Systems Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82453</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82453"/>
		<updated>2013-11-12T20:24:54Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Survey of Primitives for Synchronization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Types of Synchronization==&lt;br /&gt;
&lt;br /&gt;
===Locks===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;syncstudy&amp;quot;&amp;gt;[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods&lt;br /&gt;
in Commonly Used Languages and Systems Cederman et al.]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82452</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82452"/>
		<updated>2013-11-12T19:43:56Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;syncstudy&amp;quot;&amp;gt;[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods&lt;br /&gt;
in Commonly Used Languages and Systems Cederman et al.]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82451</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82451"/>
		<updated>2013-11-12T19:43:19Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf A Study of the Behavior of Synchronization Methods&lt;br /&gt;
in Commonly Used Languages and Systems Cederman et al.]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82450</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82450"/>
		<updated>2013-11-12T19:41:43Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Co-Array&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;[http://www.co-array.org Co-Array Fortran]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82449</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82449"/>
		<updated>2013-11-12T19:39:21Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;http://www.co-array.org&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82448</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82448"/>
		<updated>2013-11-12T19:32:18Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;{{cite web|url=http://www.co-array.org|title=Co-Array Fortran|last=Wallcraft|first=Alan|accessdate=12 November 2013}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82447</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82447"/>
		<updated>2013-11-12T19:30:11Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;{{cite web|url=http://www.co-array.org|title=Co-Array Fortran|last=Wallcraft|first=Alan|accessdate=12 November 2013}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82446</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82446"/>
		<updated>2013-11-12T19:30:03Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Supported Synchronization in Different Languages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;{{cite web|url=http://www.co-array.org|title=Co-Array Fortran|last=Wallcraft|first=Alan|accessdate=12 November 2013}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82445</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82445"/>
		<updated>2013-11-12T19:29:41Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Supported Synchronization in Different Languages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;{{cite web|url=http://www.co-array.org|title=Co-Array Fortran|last=Wallcraft|first=Alan|accessdate=12 November 2013}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82444</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82444"/>
		<updated>2013-11-12T19:27:38Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;{{cite web|url=http://www.co-array.org|title=Co-Array Fortran|last=Wallcraft|first=Alan|accessdate=12 November 2013}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82443</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82443"/>
		<updated>2013-11-12T19:21:29Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;{{cite web|url=http://www.co-array.org|accessdate=12 November 2013}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82442</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82442"/>
		<updated>2013-11-12T19:20:40Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;{{cite web|url=http://www.co-array.org|accessdate=12 November 2013}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82441</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82441"/>
		<updated>2013-11-12T19:10:17Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Supported Synchronization in Different Languages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Coarray&amp;lt;ref name=&amp;quot;coarray&amp;quot;&amp;gt;{{cite web|url=http://www.co-array.org|accessdate=12 November 2013}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82440</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82440"/>
		<updated>2013-11-12T19:05:59Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Coarray&amp;lt;ref name=umdguide&amp;gt;{{cite web|url=http://www.co-array.org|accessdate=12 November 2013}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82439</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82439"/>
		<updated>2013-11-12T19:03:43Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* Supported Synchronization in Different Languages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
The following table shows different programming languages and their support for various synchronization methods. The cells are color coded based on the following key:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Supported Operating Systems Key&lt;br /&gt;
|'''None'''&lt;br /&gt;
|style=&amp;quot;background:#0000ff;color:white&amp;quot;|'''Windows Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ff00&amp;quot;|'''Mac Only'''&lt;br /&gt;
|style=&amp;quot;background:#ff0000;color:white&amp;quot;|'''Linux Only'''&lt;br /&gt;
|style=&amp;quot;background:#00ffff&amp;quot;|'''Windows &amp;amp; Mac'''&lt;br /&gt;
|style=&amp;quot;background:#ff00ff;color:white&amp;quot;|'''Windows &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#ffff00&amp;quot;|'''Mac &amp;amp; Linux'''&lt;br /&gt;
|style=&amp;quot;background:#000000;color:#ffffff&amp;quot;|'''All'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Java&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|C++&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Ruby&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Python&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|PHP&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|Fortran&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Coarray&amp;lt;ref name=umdguide&amp;gt;{{cite web|url=http://www.co-array.org|accessdate=12 November 2013}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{reflist}}&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82438</id>
		<title>CSC 456 Fall 2013/7a ac</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC_456_Fall_2013/7a_ac&amp;diff=82438"/>
		<updated>2013-11-12T17:22:09Z</updated>

		<summary type="html">&lt;p&gt;Cejohns2: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Survey of Primitives for Synchronization=&lt;br /&gt;
==Assignment==&lt;br /&gt;
7a.  Survey of primitives for synchronization&lt;br /&gt;
Section 7.3 of Solihin covers the need for synchronization at the program level.  It mentions lock and unlock operations.  But real programs do not usually call lock and unlock mechanisms.  Instead, they use higher-level operations, such as Java’s synchronized statement, or Open MP pragmas.  Consider popular languages and common OSs such as Linux, MacOS, and Windows.  How would programs do synchronization in these environments?&lt;br /&gt;
==Ideas==&lt;br /&gt;
synchronization constucts&lt;br /&gt;
&lt;br /&gt;
syncs in clr&lt;br /&gt;
semaphores in monitors (how many langs available in?)&lt;br /&gt;
&lt;br /&gt;
Different Synchronization Constructs, languages that support them, general info.&lt;br /&gt;
&lt;br /&gt;
Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Test-and-Test-and-Set&lt;br /&gt;
&lt;br /&gt;
Lock-free&lt;br /&gt;
&lt;br /&gt;
Array-lock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Semaphore-Java, C&lt;br /&gt;
Acquire/Release the semaphore to enter the critical section. Only 1 thread can have the semaphore at a time.&lt;br /&gt;
&lt;br /&gt;
Mutex-Java, C&lt;br /&gt;
Like a binary semaphore, but with a few differences such as deletion safety (a process holding a mutex cannot be deleted).&lt;br /&gt;
&lt;br /&gt;
Monitor-Java, C&lt;br /&gt;
&lt;br /&gt;
Synchronized-Java&lt;br /&gt;
&lt;br /&gt;
pragma-C (OpenMP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a study of behavior of synchronization methods in commonly used languages and systems&lt;br /&gt;
cederman et al.&lt;br /&gt;
&lt;br /&gt;
==Supported Synchronization in Different Languages==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Synchronization Support&lt;br /&gt;
!Language !! Semaphore/Mutex !! Monitor !! OpenMP !! Synchronized !! Other&lt;br /&gt;
|-&lt;br /&gt;
|[[C]]&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[Java]]&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[C++]]&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Slim Rd/Wr Lock (SRW)&lt;br /&gt;
|-&lt;br /&gt;
|[[C#]]&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ff0000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[Ruby]]&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|[[Python]]&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|[[PHP]]&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Get Sources&lt;br /&gt;
|-&lt;br /&gt;
|[[Fortran]]&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#000000&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background:#ffffff&amp;quot;|&lt;br /&gt;
|Coarray&amp;lt;ref name=umdguide&amp;gt;{{cite web|url=http://www.co-array.org|accessdate=12 November 2013}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{reflist}}&lt;br /&gt;
[http://www.cse.chalmers.se/~tsigas/papers/StudySynchronization-IPDPS13.pdf Cederman et al.]&lt;br /&gt;
&lt;br /&gt;
[https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Multithreading/ThreadSafety/ThreadSafety.html Apple Synchronization]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/magazine/jj721588.aspx C++ Sync Article]&lt;/div&gt;</summary>
		<author><name>Cejohns2</name></author>
	</entry>
</feed>