Предотвращение ветвления ()/SIGCHLD состояние состязания

Вы можете объединить все навигаторы на одной странице, если вы импортируете все страницы.

import WelcomeScreen from './WelcomeScreen.js', 
import ProfileScreen from './ProfileScreen.js',
import SettingsScreen from './SettingsScreen.js',
import LogoutScreen from './LogoutScreen.js',

const WelcomeTabNavigator = createBottomTabNavigator({
  Welcome: {screen: WelcomeScreen,},
  Profile: {screen: ProfileScreen,},
  Settings: {screen: SettingsScreen,},
},

const WelcomeStackNavigator = createStackNavigator({
  Home: {screen: WelcomeTabNavigator,},
  Logout: {screen: LogoutScreen,},
})

 class App extends React.Component {
        render() {
          return <WelcomeStackNavigator />;
        }
      }

export default App;
14
задан 4 December 2008 в 11:45
поделиться

3 ответа

Простое решение состояло бы в том, чтобы заблокировать сигнал SIGCHLD прежде fork() с sigprocmask() и разблокируйте его в родительском коде после обработки pid.

Если ребенок умер, обработчик сигналов для SIGCHLD назовут после разблокирования сигнала. Это - критическое понятие раздела - в Вашем случае, который критический раздел запускает прежде fork() и концы после children.add().

15
ответ дан 1 December 2019 в 14:33
поделиться

В дополнение к существующим "детям" добавляют новую структуру данных "ранние смертельные случаи". Это будет содержать содержание в чистоте детей.

  // main program excerpt
    for (;;) {
      if ( is_time_to_make_babies ) {

        pid = fork();
        if (pid == -1) {
          /* fail */
        } else if (pid == 0) {
          /* child stuff */
          print "child started"
          exit
        } else {
          /* parent stuff */
          print "parent forked new child ", pid
          if (!earlyDeaths.contains(pid)) {
              children.add(pid);
          } else {
              earlyDeaths.remove(pid);
          }
        }

      }
    }

  // SIGCHLD handler
  sigchld_handler(signo) {
    while ( (pid = wait(status, WNOHANG)) > 0 ) {
      print "parent caught SIGCHLD from ", pid
      if (children.contains(pid)) {
          children.remove(pid);
      } else {
          earlyDeaths.add(pid);
      }
    }
  }

Править: это может быть упрощено, если Ваш процесс единственный, распараллелил - earlyDeaths, не должен быть контейнер, он просто должен содержать один pid.

-1
ответ дан 1 December 2019 в 14:33
поделиться

Если вы не можете использовать критический фрагмент, возможно, простой счетчик может сделать эту работу. +1 при добавлении, -1 при удалении, неважно, какое из них произойдет первым, в конце концов, вы можете получить ноль, когда все будет сделано.

0
ответ дан 1 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: