There are two other libraries that should be used, if possible.
1)
AltSoftSerial is the best alternative:
It only works on two specific pins.
You can only have one instance of AltSoftSerial.
It can transmit and receive at the same time.
It is very efficient.
2)
NeoSWSerial is almost as good:
It works on any pins.
It only supports baud rates 9600, 19200 and 38400.
You can have multiple instances of NeoSWSerial, but you can only listen to one at a time.
It can transmit and receive at the same time.
It is almost as efficient as AltSoftSerial, but it is still much better than SoftwareSerial.
Are you sure you need 3 serial ports? That is, are you sure you need 1 HardwareSerial (i.e.,
Serial) and 2 software serial ports? Sometimes, a device only needs to send to the Arduino (e.g., a GPS) or only receive from the Arduino (e.g., a display). You could use one serial port for both devices, as long as you can set them to the same baud rate.
Sometimes you can hook both of their receive pins to the Arduino transmit pin, and send commands to both. This is possible if the command sets are "different" enough. For example, GPS commands start with a '$' and SIM commands start with "AT". They would each ignore the commands for the other device.
And if your final installation does not use the USB port (aka
Serial), you could use it for one of your interfaces.
BTW, calling
listen() empties the input buffer, so you will never find any characters available after switching.

Cheers,
/dev