Shaz Qadeer

Shaz Qadeer shaz.qadeer

Niner since 2008

Shaz is a Senior Researcher in the RiSE group at Microsoft Research. He develops tools for analyzing complex software systems. He is specially interested in design, analysis, and testing of concurrent programs.


  • RiSE at the Principles of Programming Languages' 09

    Hi Mario,

    Thank you for your encouraging words.  It is not everyday that somebody finds one of our "academic" articles amazing.  I was wondering which article in particular you were referring to.  Was it the one titled "A calculus of atomic actions"?  We would be very interested in your feedback on the article.  Also, let us know if you would like a deeper dive on any of these papers, perhaps in a Channel 9 video.

  • CHESS: An Automated Concurrency Testing Tool

    Response to DukeNukem:

    1.  You are right.  Usually, the number of steps would vary from one thread to another. We can do a similar analysis in terms of the total number of steps in the entire program (summed over all threads).  If s is the total number of steps, n is the number of threads, and c is the preemption-bound, then the total number of executions could be as large as n^s and the number of executions with at most c preemptions is bounded by (s^c)*(n+c)!. 

    2.  There are many options for choosing the control locations for introducing a preemption.  By default, CHESS introduces preemptions at calls to threading and synchronization APIs.  But, a user could instruct the .NET version of CHESS to introduce preemptions at accesses to volatile variables.  Also, you could instrument your code with a callback to CHESS to indicate that CHESS should put a preemption point there.  We are planning to provide more options in the future, including the ability to automatically put a preemption at a variable access in a thread when that access is found to race with a conflicting access in another thread.

    3.  I am not sure I understand your final question.  A thread usually makes a number of steps.  A step in a thread is the execution of code from one context-switch point to the next one.  As explained above, there is flexibility in choosing the locations where CHESS introduces context switches.