Timing issue between two CAN message

So i am using two CAN shield stacked on one another. i am trying to receive the same message with the same identifier but on different CAN networks. I want to receive both of them together, compare and print the difference.
The problem i am facing is both the can messages are received at different times so at one point of time it shows the difference while other time it receives a 0 from the other can message and shows a difference of negative the first value (Voltage1-voltage2).
there is a timing issue. how do i solve this so i i keep the previous value and only compare when both the messages have been received?
Thank you again.

#include <mcp_can.h>
#include <SPI.h>
static int Voltage1;
static int Voltage2;


const int SPI_CS_PIN1 = 9; // select pin 9
const int SPI_CS_PIN2 = 10 ; // select pin 10


MCP_CAN CAN1 (SPI_CS_PIN1); 
MCP_CAN CAN2 (SPI_CS_PIN2);                                     // Set CS pin

void setup()
{
    Serial.begin(9600);

   if (CAN_OK != CAN1.begin(CAN_500KBPS) && CAN_OK != CAN2.begin(CAN_500KBPS) )              // init can bus : baudrate = 500k
    {
        Serial.println("CAN BUS Shield init fail");
        Serial.println(" Init CAN BUS Shield again");
        delay(100);
    }
    Serial.println("CAN BUS Shield init ok!");
    
}


unsigned char data3[8] = {04,00,00,00,00,00,00,00}; // Wake up can

void loop()
{
  
    unsigned char len1 = 0;// clear flag  unsigned char len1 = 0;
    unsigned char buf1[8];
    unsigned char len2 = 0;
    unsigned char buf2[8];
    
    CAN1.sendMsgBuf(0x700,0,8,data3); // Send pack 1 to communicate
    CAN2.sendMsgBuf(0x700,0,8,data3); // Send pack 2 to communicate
    
    
    
    if(CAN_MSGAVAIL == CAN1.checkReceive())         // check if data coming
    {
       CAN1.readMsgBuf(&len1, buf1); 
       unsigned int canId1 = CAN1.getCanId();

      if (canId1==768)
          {
            
                    unsigned int x1= buf1[2]; //Select bit
                    unsigned int y1= buf1[3];
                    unsigned int z1= x1*256 + y1; //concatenate
                    Voltage1 = z1*0.002; //Convert obtained decimal value to voltage  
                    Serial.println(Voltage1);      
          }
         
     }
      if(CAN_MSGAVAIL == CAN2.checkReceive()) 
      {
          CAN2.readMsgBuf(&len2, buf2);  
          unsigned int canId2 = CAN2.getCanId();
          
      if (canId2==768)
      {
                    unsigned int x2= buf2[2]; //Select bit
                    unsigned int y2= buf2[3];
                    unsigned int z2= x2*256 + y2; //concatenate
                    Voltage2 = z2*0.002; //Convert obtained decimal value to voltage  
                    Serial.println(Voltage2);        
          }
          
      }
       int difference=Voltage1-Voltage2;
      Serial.println(difference);

It hardly makes sense, when you have one file to be compiled, to make global variables static.

You test, independently, that you have received each message. When that happens, set a flag, gotMess1 or gotMess2. Then, when gotMess1 and gotMess2 are both true, you've gotten both messages, so set both flags to false and do whatever you need to do with the messages.

Can you explain or write a short code for that? i really new to this.
Thank you

Can you explain or write a short code for that?

Sure.

// Global variables
bool gotMess1 = false;
bool gotMess2 = false;

// add to loop
   if(gotMess1 && gotMess2)
   {
      useMessages();
      gotMess1 = false;
      gotMess2 = false;
   }

You will need to figure out where to add:

   gotMess1 = true;

and

   gotMess2 = true;

but that shouldn't be hard, as I've already told you where.

You will also need to create the useMessages() function, and move the appropriate part of your code to that function.