假设我们有一个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相同,则-
让我们看下面的实现以更好地理解-
#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]