Select in Fortran
In Fortran, we don’t have a direct equivalent to Go’s select
statement for channel operations. However, we can simulate similar behavior using Fortran’s coarrays and synchronization features. Here’s an example that demonstrates a similar concept:
program select_example
use iso_fortran_env
implicit none
integer :: i
character(len=10) :: msg
! Simulate two channels
character(len=10), save :: c1[*], c2[*]
! Start two asynchronous tasks
if (this_image() == 1) then
call sleep(1)
c1 = "one"
sync images(2)
else if (this_image() == 2) then
call sleep(2)
c2 = "two"
sync images(1)
end if
! Main program waits for both tasks
if (this_image() == 1) then
do i = 1, 2
if (c1 /= "") then
msg = c1
c1 = ""
else if (c2[2] /= "") then
msg = c2[2]
c2[2] = ""
end if
print *, "received ", trim(msg)
end do
end if
end program select_example
This Fortran program simulates the behavior of the Go example using coarrays. Here’s how it works:
We define two coarray variables
c1
andc2
to simulate channels.We use multiple images (Fortran’s equivalent to goroutines) to perform concurrent operations. Image 1 and Image 2 simulate the two goroutines in the Go example.
Each image sleeps for a different duration (1 second and 2 seconds) before setting its respective coarray variable.
The main program (Image 1) then checks these coarray variables in a loop, simulating the
select
statement in Go.When a value is received, it’s printed and the corresponding coarray variable is cleared.
To run this program, you would need to compile it with a Fortran compiler that supports coarrays and run it with at least two images. For example:
$ gfortran -fcoarray=lib select_example.f90 -o select_example
$ ./select_example
The output would be similar to the Go example:
received one
received two
Note that the total execution time would be about 2 seconds, as both the 1-second and 2-second sleeps execute concurrently in different images.
This Fortran example demonstrates concurrent execution and synchronization between different images, which is analogous to the goroutines and channel operations in the original Go code.