查找C ++中多个线程之间的内存冲突

假设我们有一个RAM,并且RAM是按块组织的。系统上正在运行多个进程。我们必须记住,每个进程都会获得以下信息(线程T,内存块M,时间t,R / W),这表明线程T在给定的时间t正在实现内存块M,并且操作可以是read(R )或写(W)。

以下情况表明是否是内存冲突-

  • 在同一位置进行多个读取操作不是冲突的原因。

  • 当在x + 5到x-5之间对M的位置执行写入操作时,它将负责在时间x(其中x称为某个时间)处为线程访问位置M造成线程冲突。

因此,如果线程T1在时间x + 1访问了内存位置M,而线程T2在时间x + 6之前访问了内存M,那么当T1和T2中的一个进行写操作时,它们就会发生冲突。

如果我们有访问内存位置的线程列表。我们必须找到所有冲突。

因此,如果输入类似于[[(1,932,1,R),(2,512,2,W),(3,932,3,R),(4,512,4,R),(5 ,432,5,R),(6,512,6,R),(7,835,7,W),(8,432,8,R)],则输出将为冲突线程(2,4 )和(2,6),其他所有操作都相同。

为了解决这个问题,我们将遵循以下步骤-

  • 使用id,memory_block,时间和操作创建线程

  • 根据存储块对数组th_arr进行排序,当存储块相同时使用时间。

  • 对于初始化i:= 1,当i − n,更新(i增加1)时,-

    • 如果th_arr [i] .time <= th_arr [i-1] .time + 5,则-

    • 如果th_arr [i] .operation与'W'相同或th_arr [j] .operation与'W'相同,则-

    • (将j减1)

    • 显示冲突的线程th_arr [j]和th_arr [i]

    • j:= i-1

    • 而(th_arr [i] .memory_block与th_arr [j] .memory_block和th_arr [i] .time <= th_arr [j] .time + 5并且j> = 0相同),执行-

    • 如果th_arr [i] .memory_block与th_arr [i-1] .memory_block相同,则-

    范例(C ++)

    让我们看下面的实现以更好地理解-

    #include<bits/stdc++.h>
    using namespace std;
    class Thread {
       public:
       int id, memory_block, time;
       char operation;
    };
    bool compare(const Thread& x, const Thread& y) {
       if (x.memory_block == y.memory_block)
          return x.time < y.time;
       else return x.memory_block < y.memory_block;
    }
    void display_conflicts(Thread th_arr[], int n) {
       sort(th_arr, th_arr+n, compare);
       for (int i = 1; i < n; i++) {
          if(th_arr[i].memory_block == th_arr[i-1].memory_block) {
             if (th_arr[i].time <= th_arr[i-1].time+5) {
                int j = i-1;
                while (th_arr[i].memory_block == th_arr[j].memory_block && th_arr[i].time <= th_arr[j].time+5 && j >= 0) {
                   if (th_arr[i].operation == 'W' || th_arr[j].operation == 'W') {
                      cout << "Conflicting threads [" << th_arr[j].id << ", " << th_arr[i].id << "]\n";
                   }
                   j--;
                }
             }
          }
       }
    }
    int main() {
       Thread th_arr[] = {{1, 932, 1, 'R'},{2, 512, 2, 'W'},{3, 932, 3, 'R'}, {4, 512, 4, 'R'},{5, 432, 5, 'R'}, {6, 512, 6, 'R'},{7, 835, 7, 'W'}, {8, 432, 8, 'R'}};
       int n = sizeof(th_arr)/sizeof(th_arr[0]);
       display_conflicts(th_arr, n);
    }

    输入值

    {{1, 932, 1, 'R'},{2, 512, 2, 'W'},{3, 932, 3, 'R'}, {4, 512, 4,
    'R'},{5, 432, 5, 'R'}, {6, 512, 6, 'R'},{7, 835, 7, 'W'}, {8, 432, 8,
    'R'}}

    输出结果

    Conflicting threads [2, 4]
    Conflicting threads [2, 6]