Run named thread functions and store their results in stable slots before joining.

thread result Threads may finish in either order, so shared examples should put results in predictable positions before the main thread reads them.

Thread Result Slots

seed
ThreadResultSlots.kt
Replay: real traced execution (multi-file project)
fun fillDouble(seed: Int, results: IntArray) {
    val doubled = seed * 2
    results[0] = doubled
}

fun fillTriple(seed: Int, results: IntArray) {
    val tripled = seed * 3
    results[1] = tripled
}

fun main() {
    val seed = 6
    val results = IntArray(2)

    val first = Thread { fillDouble(seed, results) }
    val second = Thread { fillTriple(seed, results) }

    first.start()
    second.start()
    first.join()
    second.join()

    val total = results[0] + results[1]
    println("seed=$seed")
    println("total=$total")
}
fun fillDouble(seed: Int, results: IntArray) {
    val doubled = seed * 2
    results[0] = doubled
}

fun fillTriple(seed: Int, results: IntArray) {
    val tripled = seed * 3
    results[1] = tripled
}

fun main() {
    val seed = 3
    val results = IntArray(2)

    val first = Thread { fillDouble(seed, results) }
    val second = Thread { fillTriple(seed, results) }

    first.start()
    second.start()
    first.join()
    second.join()

    val total = results[0] + results[1]
    println("seed=$seed")
    println("total=$total")
}
fun fillDouble(seed: Int, results: IntArray) {
    val doubled = seed * 2
    results[0] = doubled
}

fun fillTriple(seed: Int, results: IntArray) {
    val tripled = seed * 3
    results[1] = tripled
}

fun main() {
    val seed = 10
    val results = IntArray(2)

    val first = Thread { fillDouble(seed, results) }
    val second = Thread { fillTriple(seed, results) }

    first.start()
    second.start()
    first.join()
    second.join()

    val total = results[0] + results[1]
    println("seed=$seed")
    println("total=$total")
}
  1. seed ← 6, first ← Thread[#19,Thread-0,5,main], second ← Thread[#20,Thread-1,5,main]

    11fun main() {12    val seed→ 6 = 6 //@seed=3, 1013    val results = IntArray(2)1415    val first→ Thread[#19,Thread-0,5,main] = Thread { fillDouble(seed, results) }16    val second→ Thread[#20,Thread-1,5,main] = Thread { fillTriple(seed, results) }1718    firstThread[#19,Thread-0,5,main].start()19    secondThread[#20,Thread-1,5,main].start()20    first.join()
  2. fun fillDouble(seed: Int, results: IntArray)

    1fun fillDouble(seed6: Int, results: IntArray) {2    val doubled = seed6 * 23    results[0] = doubled
  3. doubled ← 12

    1fun fillDouble(seed: Int, results: IntArray) {2    val doubled→ 12 = seed6 * 23    results[0] = doubled4}56fun fillTriple(seed6: Int, results: IntArray) {7    val tripled = seed6 * 38    results[1] = tripled
  4. tripled ← 18, total ← 30

    2    val doubled = seed * 23    results[0]0 = doubled124}56fun fillTriple(seed: Int, results: IntArray) {7    val tripled→ 18 = seed6 * 38    results[1]0 = tripled189}1011fun main() {12    val seed = 6 //@seed=3, 1013    val results = IntArray(2)1415    val first = Thread { fillDouble(seed, results) }16    val second = Thread { fillTriple(seed, results) }1718    first.start()19    secondThread[#20,Thread-1,5,main].start()20    firstThread[#19,Thread-0,5,].join()21    secondThread[#20,Thread-1,5,].join()2223    val total→ 30 = results[0]12 + results[1]1824    println("seed=$seed6")25    println("total=$total30")26}
    outputseed=6
    total=30
  1. seed ← 3, first ← Thread[#19,Thread-0,5,main], second ← Thread[#20,Thread-1,5,main]

    11fun main() {12    val seed→ 3 = 313    val results = IntArray(2)1415    val first→ Thread[#19,Thread-0,5,main] = Thread { fillDouble(seed, results) }16    val second→ Thread[#20,Thread-1,5,main] = Thread { fillTriple(seed, results) }1718    firstThread[#19,Thread-0,5,main].start()19    secondThread[#20,Thread-1,5,main].start()20    first.join()
  2. fun fillDouble(seed: Int, results: IntArray)

    1fun fillDouble(seed3: Int, results: IntArray) {2    val doubled = seed3 * 23    results[0] = doubled
  3. doubled ← 6

    1fun fillDouble(seed: Int, results: IntArray) {2    val doubled→ 6 = seed3 * 23    results[0] = doubled4}56fun fillTriple(seed: Int, results: IntArray) {7    val tripled = seed * 38    results[1] = tripled9}1011fun main() {12    val seed = 313    val results = IntArray(2)1415    val first = Thread { fillDouble(seed, results) }16    val second = Thread { fillTriple(seed, results) }1718    first.start()19    secondThread[#20,Thread-1,5,main].start()20    firstThread[#19,Thread-0,5,main].join()21    second.join()
  4. tripled ← 9

    2    val doubled = seed * 23    results[0]0 = doubled64}56fun fillTriple(seed3: Int, results: IntArray) {7    val tripled→ 9 = seed3 * 38    results[1] = tripled
  5. first ← Thread[#19,Thread-0,5,], second ← Thread[#20,Thread-1,5,]

    7    val tripled = seed * 38    results[1]0 = tripled99}1011fun main() {12    val seed = 313    val results = IntArray(2)1415    val first = Thread { fillDouble(seed, results) }16    val second = Thread { fillTriple(seed, results) }1718    first.start()19    second.start()20    first→ Thread[#19,Thread-0,5,].join()21    second→ Thread[#20,Thread-1,5,].join()2223    val total→ 15 = results[0]6 + results[1]924    println("seed=$seed3")25    println("total=$total15")26}
    outputseed=3
    total=15
  1. seed ← 10, first ← Thread[#19,Thread-0,5,main], second ← Thread[#20,Thread-1,5,main]

    11fun main() {12    val seed→ 10 = 1013    val results = IntArray(2)1415    val first→ Thread[#19,Thread-0,5,main] = Thread { fillDouble(seed, results) }16    val second→ Thread[#20,Thread-1,5,main] = Thread { fillTriple(seed, results) }1718    firstThread[#19,Thread-0,5,main].start()19    second.start()
  2. fun fillDouble(seed: Int, results: IntArray)

    1fun fillDouble(seed10: Int, results: IntArray) {2    val doubled = seed * 2
  3. doubled ← 20

    1fun fillDouble(seed: Int, results: IntArray) {2    val doubled→ 20 = seed10 * 23    results[0] = doubled4}56fun fillTriple(seed: Int, results: IntArray) {7    val tripled = seed * 38    results[1] = tripled9}1011fun main() {12    val seed = 1013    val results = IntArray(2)1415    val first = Thread { fillDouble(seed, results) }16    val second = Thread { fillTriple(seed, results) }1718    first.start()19    secondThread[#20,Thread-1,5,main].start()20    firstThread[#19,Thread-0,5,main].join()21    second.join()
  4. tripled ← 30

    2    val doubled = seed * 23    results[0]0 = doubled204}56fun fillTriple(seed10: Int, results: IntArray) {7    val tripled→ 30 = seed10 * 38    results[1] = tripled
  5. first ← Thread[#19,Thread-0,5,], total ← 50

    7    val tripled = seed * 38    results[1]0 = tripled309}1011fun main() {12    val seed = 1013    val results = IntArray(2)1415    val first = Thread { fillDouble(seed, results) }16    val second = Thread { fillTriple(seed, results) }1718    first.start()19    second.start()20    first→ Thread[#19,Thread-0,5,].join()21    secondThread[#20,Thread-1,5,].join()2223    val total→ 50 = results[0]20 + results[1]3024    println("seed=$seed10")25    println("total=$total50")26}
    outputseed=10
    total=50