Lamport's logical clock

Last Updated : 3 Oct, 2025

Lamport's Logical Clock was created by Leslie Lamport. It is a procedure to determine the order of events occurring. It provides a basis for the more advanced Vector Clock Algorithm. Due to the absence of a Global Clock in a Distributed Operating System Lamport Logical Clock is needed.

Algorithm:

  • Happened before relation(->): a -> b, means 'a' happened before 'b'.
  • Logical Clock: The criteria for the logical clocks are:
    • [C1]: Ci (a) < Ci(b), [ Ci -> Logical Clock, If 'a' happened before 'b', then time of 'a' will be less than 'b' in a particular process. ]
    • [C2]: Ci(a) < Cj(b), [ Clock value of Ci(a) is less than Cj(b) ]

Reference:

  • Process: Pi
  • Event: Eij, where i is the process in number and j: jth event in the ith process.
  • tm: vector time span for message m.
  • Ci vector clock associated with process Pi, the jth element is Ci[j] and contains Pi's latest value for the current time in process Pj.
  • d: drift time, generally d is 1.

Implementation Rules[IR]:

  • [IR1]: If a -> b ['a' happened before 'b' within the same process] then, Ci(b)  =Ci(a) + d
  • [IR2]: Cj = max(Cj, tm + d) [If there's more number of processes, then tm = value of Ci(a), Cj = max value between Cj and tm + d]

For Example:

  • Take the starting value as 1, since it is the 1st event and there is no incoming value at the starting point:
    • e11 = 1
    • e21 = 1
  • The value of the next point will go on increasing by d (d = 1), if there is no incoming value i.e., to follow [IR1].
    • e12 = e11 + d = 1 + 1 = 2
    • e13 = e12 + d = 2 + 1 = 3
    • e14 = e13 + d = 3 + 1 = 4
    • e15 = e14 + d = 4 + 1 = 5
    • e16 = e15 + d = 5 + 1 = 6
    • e22 = e21 + d = 1 + 1 = 2
    • e24 = e23 + d = 3 + 1 = 4
    • e26 = e25 + d = 6 + 1 = 7
  • When there will be incoming value, then follow [IR2] i.e., take the maximum value between Cj and Tm + d.
    • e17 = max(7, 5) = 7, [e16 + d = 6 + 1 = 7, e24 + d = 4 + 1 = 5, maximum among 7 and 5 is 7]
    • e23 = max(3, 3) = 3, [e22 + d = 2 + 1 = 3, e12 + d = 2 + 1 = 3, maximum among 3 and 3 is 3]
    • e25 = max(5, 6) = 6, [e24 + 1 = 4 + 1 = 5, e15 + d = 5 + 1 = 6, maximum among 5 and 6 is 6]

Limitation:

  • In case of [IR1], if a -> b, then C(a) < C(b) -> true.
  • In case of [IR2], if  a -> b, then C(a) < C(b) -> May be true or may not be true.

Below is the C program to implement Lamport's Logical Clock:

C++
// C++ program to illustrate the Lamport's
// Logical Clock

#include <bits/stdc++.h>
using namespace std;

// Function to find the maximum timestamp
// between 2 events
int max1(int a, int b)
{
    // Return the greatest of the two
    if (a > b)
        return a;
    else
        return b;
}

// Function to display the logical timestamp
void display(int e1, int e2,
             int p1[5], int p2[3])
{
    int i;

    cout << "\nThe time stamps of "
         "events in P1:\n";

    for (i = 0; i < e1; i++) {
        cout << p1[i] << " ";
    }

    cout << "\nThe time stamps of "
         "events in P2:\n";

    // Print the array p2[]
    for (i = 0; i < e2; i++)
        cout << p2[i] << " ";
}

// Function to find the timestamp of events
void lamportLogicalClock(int e1, int e2,
                         int m[5][3])
{
    int i, j, k, p1[e1], p2[e2];

    // Initialize p1[] and p2[]
    for (i = 0; i < e1; i++)
        p1[i] = i + 1;

    for (i = 0; i < e2; i++)
        p2[i] = i + 1;
    cout << "\t";
    for (i = 0; i < e2; i++)
        cout << "\te2" << i + 1;

    for (i = 0; i < e1; i++) {

        cout << "\n e1" << i + 1 << "\t";

        for (j = 0; j < e2; j++)
            cout << m[i][j] << "\t";
    }

    for (i = 0; i < e1; i++) {
        for (j = 0; j < e2; j++) {

            // Change the timestamp if the
            // message is sent
            if (m[i][j] == 1) {
                p2[j] = max1(p2[j], p1[i] + 1);
                for (k = j + 1; k < e2; k++)
                    p2[k] = p2[k - 1] + 1;
            }

            // Change the timestamp if the
            // message is received
            if (m[i][j] == -1) {
                p1[i] = max1(p1[i], p2[j] + 1);
                for (k = i + 1; k < e1; k++)
                    p1[k] = p1[k - 1] + 1;
            }
        }
    }

    // Function Call
    display(e1, e2, p1, p2);
}

// Driver Code
int main()
{
    int e1 = 5, e2 = 3, m[5][3];

    // message is sent and received
    // between two process

    /*dep[i][j] = 1, if message is sent
                   from ei to ej
    dep[i][j] = -1, if message is received
                    by ei from ej
    dep[i][j] = 0, otherwise*/
    m[0][0] = 0;
    m[0][1] = 0;
    m[0][2] = 0;
    m[1][0] = 0;
    m[1][1] = 0;
    m[1][2] = 1;
    m[2][0] = 0;
    m[2][1] = 0;
    m[2][2] = 0;
    m[3][0] = 0;
    m[3][1] = 0;
    m[3][2] = 0;
    m[4][0] = 0;
    m[4][1] = -1;
    m[4][2] = 0;

    // Function Call
    lamportLogicalClock(e1, e2, m);

    return 0;
}
C
// C program to illustrate the Lamport's
// Logical Clock
#include <stdio.h>

// Function to find the maximum timestamp
// between 2 events
int max1(int a, int b)
{
    // Return the greatest of the two
    if (a > b)
        return a;
    else
        return b;
}

// Function to display the logical timestamp
void display(int e1, int e2,
             int p1[5], int p2[3])
{
    int i;

    printf("\nThe time stamps of "
           "events in P1:\n");

    for (i = 0; i < e1; i++) {
        printf("%d ", p1[i]);
    }

    printf("\nThe time stamps of "
           "events in P2:\n");

    // Print the array p2[]
    for (i = 0; i < e2; i++)
        printf("%d ", p2[i]);
}

// Function to find the timestamp of events
void lamportLogicalClock(int e1, int e2,
                         int m[5][3])
{
    int i, j, k, p1[e1], p2[e2];

    // Initialize p1[] and p2[]
    for (i = 0; i < e1; i++)
        p1[i] = i + 1;

    for (i = 0; i < e2; i++)
        p2[i] = i + 1;

    for (i = 0; i < e2; i++)
        printf("\te2%d", i + 1);

    for (i = 0; i < e1; i++) {

        printf("\n e1%d \t", i + 1);

        for (j = 0; j < e2; j++)
            printf("%d\t", m[i][j]);
    }

    for (i = 0; i < e1; i++) {
        for (j = 0; j < e2; j++) {

            // Change the timestamp if the
            // message is sent
            if (m[i][j] == 1) {
                p2[j] = max1(p2[j], p1[i] + 1);
                for (k = j + 1; k < e2; k++)
                    p2[k] = p2[k - 1] + 1;
            }

            // Change the timestamp if the
            // message is received
            if (m[i][j] == -1) {
                p1[i] = max1(p1[i], p2[j] + 1);
                for (k = i + 1; k < e1; k++)
                    p1[k] = p1[k - 1] + 1;
            }
        }
    }

    // Function Call
    display(e1, e2, p1, p2);
}

// Driver Code
int main()
{
    int e1 = 5, e2 = 3, m[5][3];

    // message is sent and received
    // between two process

    /*dep[i][j] = 1, if message is sent 
                   from ei to ej
    dep[i][j] = -1, if message is received
                    by ei from ej
    dep[i][j] = 0, otherwise*/
    m[0][0] = 0;
    m[0][1] = 0;
    m[0][2] = 0;
    m[1][0] = 0;
    m[1][1] = 0;
    m[1][2] = 1;
    m[2][0] = 0;
    m[2][1] = 0;
    m[2][2] = 0;
    m[3][0] = 0;
    m[3][1] = 0;
    m[3][2] = 0;
    m[4][0] = 0;
    m[4][1] = -1;
    m[4][2] = 0;

    // Function Call
    lamportLogicalClock(e1, e2, m);

    return 0;
}
Java
// Java program to illustrate the Lamport's
// Logical Clock
import java.util.*;
public class GFG {

  // Function to find the maximum timestamp
  // between 2 events
  static int max1(int a, int b)
  {
    // Return the greatest of the two
    if (a > b)
      return a;
    else
      return b;
  }

  // Function to display the logical timestamp
  static void display(int e1, int e2, int p1[], int p2[])
  {
    int i;
    System.out.print(
      "\nThe time stamps of events in P1:\n");

    for (i = 0; i < e1; i++) {
      System.out.print(p1[i] + " ");
    }

    System.out.println(
      "\nThe time stamps of events in P2:");

    // Print the array p2[]
    for (i = 0; i < e2; i++)
      System.out.print(p2[i] + " ");
  }

  // Function to find the timestamp of events
  static void lamportLogicalClock(int e1, int e2,
                                  int m[][])
  {
    int i, j, k;
    int p1[] = new int[e1];
    int p2[] = new int[e2];
    // Initialize p1[] and p2[]
    for (i = 0; i < e1; i++)
      p1[i] = i + 1;

    for (i = 0; i < e2; i++)
      p2[i] = i + 1;
    for (i = 0; i < e2; i++)
      System.out.print("\te2" + (i + 1));

    for (i = 0; i < e1; i++) {
      System.out.print("\n e1" + (i + 1) + "\t");
      for (j = 0; j < e2; j++)
        System.out.print(m[i][j] + "\t");
    }

    for (i = 0; i < e1; i++) {
      for (j = 0; j < e2; j++) {

        // Change the timestamp if the
        // message is sent
        if (m[i][j] == 1) {
          p2[j] = max1(p2[j], p1[i] + 1);
          for (k = j + 1; k < e2; k++)
            p2[k] = p2[k - 1] + 1;
        }

        // Change the timestamp if the
        // message is received
        if (m[i][j] == -1) {
          p1[i] = max1(p1[i], p2[j] + 1);
          for (k = i + 1; k < e1; k++)
            p1[k] = p1[k - 1] + 1;
        }
      }
    }

    // Function Call
    display(e1, e2, p1, p2);
  }

  public static void main(String args[])
  {
    int e1 = 5, e2 = 3;
    int m[][] = new int[5][3];
    // message is sent and received
    // between two process

    /*dep[i][j] = 1, if message is sent
                       from ei to ej
        dep[i][j] = -1, if message is received
                        by ei from ej
        dep[i][j] = 0, otherwise*/
    m[0][0] = 0;
    m[0][1] = 0;
    m[0][2] = 0;
    m[1][0] = 0;
    m[1][1] = 0;
    m[1][2] = 1;
    m[2][0] = 0;
    m[2][1] = 0;
    m[2][2] = 0;
    m[3][0] = 0;
    m[3][1] = 0;
    m[3][2] = 0;
    m[4][0] = 0;
    m[4][1] = -1;
    m[4][2] = 0;

    // Function Call
    lamportLogicalClock(e1, e2, m);
  }
}

// This code is contributed by nmkiniqw7b
Python3
# Python program to illustrate the Lamport's
# Logical Clock

# Function to find the maximum timestamp
# between 2 events
def max1(a, b) : 

    # Return the greatest of the two
    if a > b : 
        return a
    else : 
        return b

# Function to display the logical timestamp
def display(e1, e2, p1, p2) : 
    print()
    print("The time stamps of events in P1:")
    for i in range(0, e1) : 
        print(p1[i], end = " ")
    
    print()
    print("The time stamps of events in P2:")
    
    # Print the array p2[]
    for i in range(0, e2) : 
        print(p2[i], end = " ")

# Function to find the timestamp of events
def lamportLogicalClock(e1, e2, m) : 
    p1 = [0]*e1
    p2 = [0]*e2

    # Initialize p1[] and p2[]
    for i in range (0, e1) : 
        p1[i] = i + 1

    for i in range(0, e2) : 
        p2[i] = i + 1
    
    for i in range(0, e2) : 
        print(end = '\t')
        print("e2", end = "")
        print(i + 1, end = "")
    
    for i in range(0, e1) : 
        print()
        print("e1", end = "")
        print(i + 1, end = "\t")

        for j in range(0, e2) : 
            print(m[i][j], end = "\t")
        
    for i in range(0, e1) : 

        for j in range(0, e2) :
          
            # Change the timestamp if the
            # message is sent
            if(m[i][j] == 1) : 
                p2[j] = max1(p2[j], p1[i] + 1)
                for i in range(j + 1, e2) : 
                    p2[k] = p2[k - 1] + 1

            # Change the timestamp if the
            # message is received
            if(m[i][j] == -1) : 
                p1[i] = max1(p1[i], p2[j] + 1)
                for k in range(i + 1, e1) : 
                    p1[k] = p1[k - 1] + 1

    # Function Call
    display(e1, e2, p1, p2)

# Driver Code

if __name__ == "__main__" : 
    e1 = 5
    e2 = 3
    m = [[0]*3 for i in range(0,5)]
    
    # dep[i][j] = 1, if message is sent
    # from ei to ej
    # dep[i][j] = -1, if message is received
    # by ei from ej
    # dep[i][j] = 0, otherwise

    m[0][0] = 0
    m[0][1] = 0
    m[0][2] = 0
    m[1][0] = 0
    m[1][1] = 0
    m[1][2] = 1
    m[2][0] = 0
    m[2][1] = 0
    m[2][2] = 0
    m[3][0] = 0
    m[3][1] = 0
    m[3][2] = 0
    m[4][0] = 0
    m[4][1] = -1
    m[4][2] = 0
    
    # Function Call
    lamportLogicalClock(e1, e2, m)

    # This code is contributed by rakeshsahni

    
C#
// C# program to illustrate the Lamport's
// Logical Clock

using System;

public class GFG {

    // Function to find the maximum timestamp
    // between 2 events
    static int max1(int a, int b)
    {
        // Return the greatest of the two
        if (a > b)
            return a;
        else
            return b;
    }

    // Function to display the logical timestamp
    static void display(int e1, int e2, int[] p1, int[] p2)
    {
        int i;
        Console.Write(
            "\nThe time stamps of events in P1:\n");

        for (i = 0; i < e1; i++) {
            Console.Write(p1[i] + " ");
        }

        Console.WriteLine(
            "\nThe time stamps of events in P2:");

        // Print the array p2[]
        for (i = 0; i < e2; i++)
            Console.Write(p2[i] + " ");
    }

    // Function to find the timestamp of events
    static void lamportLogicalClock(int e1, int e2,
                                    int[, ] m)
    {
        int i, j, k;
        int[] p1 = new int[e1];
        int[] p2 = new int[e2];
        // Initialize p1[] and p2[]
        for (i = 0; i < e1; i++)
            p1[i] = i + 1;

        for (i = 0; i < e2; i++)
            p2[i] = i + 1;
        for (i = 0; i < e2; i++)
            Console.Write("\te2" + (i + 1));

        for (i = 0; i < e1; i++) {
            Console.Write("\n e1" + (i + 1) + "\t");
            for (j = 0; j < e2; j++)
                Console.Write(m[i, j] + "\t");
        }

        for (i = 0; i < e1; i++) {
            for (j = 0; j < e2; j++) {

                // Change the timestamp if the
                // message is sent
                if (m[i, j] == 1) {
                    p2[j] = max1(p2[j], p1[i] + 1);
                    for (k = j + 1; k < e2; k++)
                        p2[k] = p2[k - 1] + 1;
                }

                // Change the timestamp if the
                // message is received
                if (m[i, j] == -1) {
                    p1[i] = max1(p1[i], p2[j] + 1);
                    for (k = i + 1; k < e1; k++)
                        p1[k] = p1[k - 1] + 1;
                }
            }
        }

        // Function Call
        display(e1, e2, p1, p2);
    }

    static public void Main()
    {

        // Code
        int e1 = 5, e2 = 3;
        int[, ] m = new int[5, 3];
        // message is sent and received
        // between two process

        /*dep[i][j] = 1, if message is sent
                           from ei to ej
            dep[i][j] = -1, if message is received
                            by ei from ej
            dep[i][j] = 0, otherwise*/
        m[0, 0] = 0;
        m[0, 1] = 0;
        m[0, 2] = 0;
        m[1, 0] = 0;
        m[1, 1] = 0;
        m[1, 2] = 1;
        m[2, 0] = 0;
        m[2, 1] = 0;
        m[2, 2] = 0;
        m[3, 0] = 0;
        m[3, 1] = 0;
        m[3, 2] = 0;
        m[4, 0] = 0;
        m[4, 1] = -1;
        m[4, 2] = 0;

        // Function Call
        lamportLogicalClock(e1, e2, m);
    }
}

// This code is contributed by lokeshmvs21.
JavaScript
<script>
    // JavaScript program to illustrate the Lamport's
    // Logical Clock

    // Function to find the maximum timestamp
    // between 2 events
    const max1 = (a, b) => {
        // Return the greatest of the two
        if (a > b)
            return a;
        else
            return b;
    }

    // Function to display the logical timestamp
    const display = (e1, e2, p1, p2) => {
        let i;

        document.write(`<br/>The time stamps of events in P1:<br/>`);

        for (i = 0; i < e1; i++) {
            document.write(`${p1[i]} `);
        }

        document.write(`<br/>The time stamps of events in P2:<br/>`);

        // Print the array p2[]
        for (i = 0; i < e2; i++)
            document.write(`${p2[i]} `);
    }

    // Function to find the timestamp of events
    const lamportLogicalClock = (e1, e2, m) => {
        let i, j, k, p1 = [], p2 = [];

        // Initialize p1[] and p2[]
        for (i = 0; i < e1; i++)
            p1[i] = i + 1;

        for (i = 0; i < e2; i++)
            p2[i] = i + 1;

        for (i = 0; i < e2; i++)
            document.write(`\te2${i + 1}`)

        for (i = 0; i < e1; i++) {

            document.write(`<br/>e1${i + 1} `)
            for (j = 0; j < e2; j++)
                document.write(`${m[i][j]}\t`);
        }

        for (i = 0; i < e1; i++) {
            for (j = 0; j < e2; j++) {

                // Change the timestamp if the
                // message is sent
                if (m[i][j] == 1) {
                    p2[j] = max1(p2[j], p1[i] + 1);
                    for (k = j + 1; k < e2; k++)
                        p2[k] = p2[k - 1] + 1;
                }

                // Change the timestamp if the
                // message is received
                if (m[i][j] == -1) {
                    p1[i] = max1(p1[i], p2[j] + 1);
                    for (k = i + 1; k < e1; k++)
                        p1[k] = p1[k - 1] + 1;
                }
            }
        }

        // Function Call
        display(e1, e2, p1, p2);
    }

    // Driver Code

    let e1 = 5, e2 = 3;

    // message is sent and received
    // between two process

    /*dep[i][j] = 1, if message is sent
                from ei to ej
    dep[i][j] = -1, if message is received
                    by ei from ej
    dep[i][j] = 0, otherwise*/
    const m = [
        [0, 0, 0],
        [0, 0, 1],
        [0, 0, 0],
        [0, 0, 0],
        [0, -1, 0]
    ]

    // Function Call
    lamportLogicalClock(e1, e2, m);
    
// This code is contributed by rakeshsahni

</script>

Output
        e21    e22    e23
 e11    0    0    0    
 e12    0    0    1    
 e13    0    0    0    
 e14    0    0    0    
 e15    0    -1    0    
The time stamps of events in P1:
1 2 3 4 5 
The time stamps of events in P2:
1 2 3 

Time Complexity: O(e1 * e2 * (e1 + e2))
Auxiliary Space: O(e1 + e2)

Comment