Yep, this is possible using custom license fields: https://wyday.com/limelm/help/license-features/
For example, create an "integer" type custom license field, like "instances_allowed", then when your app starts see if the X ("instances_allowed") instances exist.
To do this you'll use global mutexes, like described here: https://support.microsoft.com/en-us/help/243953/how-to-limit-32-bit-applications-to-one-instance-in-visual-c
But instead of checking for a single instance (creating a single mutex and stopping after that fails) you'll loop through X mutexes until you either get a lock, or they all fail.
Does that make sense?
This is a good question we'll start writing an article to address this.