A binary semaphore would work if you only had one worker task. You would create the semaphore as "unavailable" / "taken", and the init task would xSemaphoreGive the semaphore when initialization is done, notifying the single worker task that initialization was complete. However, when you have several tasks, then only one of them will be able to take/acquire the semaphore.
A counting semaphore would work. The semaphore should have a capacity equal to the number of worker tasks, and it should start as empty. As system designer, you know that the init-task is designed to own the underlying resource at startup, so init-task won't have to acquire the semaphore on the first initialization. After initialization, you should call xSemaphoreGive once for each worker. When/if you want to reinitialize, call xSemaphoreTake once for each worker task. For this to work, the workers must periodically "release" the semaphore briefly and then reacquire it.
An Event Group could also be used if you'll only initialize once. Your init-task can use xEventGroupSetBits to indicate that initialization is complete. Your worker tasks can use xEventGroupWaitBits to wait until the init-task is done.