C# STM
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
STM Added ConflictType Jul 20, 2013
STMTest Added ConflictType Jul 20, 2013
TestSTMNet Changed ManualResetEvent to ManualRestEventSlim Jul 10, 2013
.gitignore initial Jul 5, 2013
README.md fixed format issue in readme Jul 25, 2013
STMNet.sln initial Jul 5, 2013

README.md

STMNet

A Lightweight Software Transactional Memory API

STMNet is an API for multithreaded computation in which shared data is synchronized without using locks. Threads synchronize by means of memory transactions, short-lived computations that either commit (take effect) or abort (have no effect). Transactions avoid the well-known problems of locking, including deadlock, priority inversion, and fault-intolerance. The STMNet is a software transactional memory package written in C#.

Quick start:

// Create STM Objects to be used by several threads
public StmObject<int> myStmValue = StmCreateObject(5);
public StmObject<SomeObject> myStmObject = Stm.CreateObject(new SomeObject(initValue));

// This method is called by a thread to do something...
public void DoSomething()
{
	using(var trans = Stm.BeginTransaction())
    {
    	// Read the value of myStmValue
    	var v = myStmValue.Read();
        
        // Create and init a new SomeObject
        var newObj = new SomeObject(v);
        
        myStmObject.Write(newObj);
    }
        
    if(Stm.Transaction.State == TransactionsState.Committed)
    {
        // Transactions committed 
    }
    
    if(Stm.Transaction.State == TransactionsState.Aborted)
    {
    	// Transactions aborted 
    }
}

Transactions Delegate and Retry Delegate

// Create STM Objects to be used by several threads
public StmObject<int> myStmValue = StmCreateObject(5);
public StmObject<SomeObject> myStmObject = Stm.CreateObject(new SomeObject(initValue));

// Create a Transaction Delegate
public void TransDelegate(Transaction transaction)
{
	using (transaction)
	{
		myStmValue.Write(2);
        
        // Create and init a new SomeObject
        var newObj = new SomeObject(myStemValue.Read());
        
        myStmObject.Write(newObj);
	}
}

// Create a Retry Delegate
public bool RetryDelegate(Transaction transaction)
{
	return transaction.RetryCount < 3;
}

// Method to execute the transaction
public void ExecuteTransTest()
{
    var trans = Stm.ExecuteTransaction(TransDelegate, RetryDelegate);
    
    if(trans.State == TransactionsState.Committed)
    {
		// Transactions committed 
    }
    
    if(trans.State == TransactionsState.Aborted)
    {
    	// Transactions aborted 
    }
}
Note:
  • Objects that take part in an STM Transaction must implement IStmObject interface