Переключение стеков в C++

Посмотрите на код здесь. Я добавил несколько точек с запятой в ваши операторы echo и добавил переменную запроса в метод mysqli_fetch_assoc. Я также добавил несколько комментариев, чтобы помочь вам понять, что я здесь сделал.

<?php
$query = "SELECT * FROM places";
$select_all_places = mysqli_query($connection, $query);

// This will be the state we are currently on. Start it as null.
$current_state = '';

while($row = mysqli_fetch_assoc($select_all_places)){
    $p_state = $row['p_state'];
    $p_city = $row['p_city'];
    $p_address = $row['p_address'];

?>
    <!-- Check if variable state is equal to current row's state. -->
    <?php if($current_state != $p_state): ?>

        <!-- Echo state if they aren't equal  -->
        <h1><?php echo $p_state; ?></h1>

        <!-- Assign new current state -->
        <?php $current_state = $p_state; ?>
    <?php endif; ?>
    <h2><?php echo $p_city; ?></h2>
    <p><?php echo $p_address; ?></p>

<?php } ?>
7
задан Paul Morrison 15 May 2009 в 01:38
поделиться

5 ответов

Удаление CLI / STI по-прежнему работает из-за различий в операционной среде.

В 16-битной DOS может произойти прерывание, и это прерывание изначально будет выполняться в том же стеке. Если вас прервали в середине операции, прерывание может дать сбой, потому что вы обновили только ss, а не sp.

В Windows и любой другой современной среде каждый поток пользовательского режима получает свой собственный стек. Если ваш поток прерывается по какой-либо причине, его стек и контекст надежно сохраняются - вы этого не делаете. не нужно беспокоиться о том, что что-то еще работает в вашем потоке и в вашем стеке. cli / sti в этом случае будет защищать от чего-то, от чего вы уже защищены операционной системой.

Как упомянул Грег, безопасный поддерживаемый способ обмена стеками, подобный этому, в Windows - CreateFiber / SwitchToFiber. У этого действительно есть побочный эффект изменения всего вашего контекста, поэтому это не похоже на простое переключение стека.

Это действительно поднимает вопрос о том, что вы хотите сделать. Часто переключение стека происходит из-за ограниченного пространства стека, которое составляло 64 КБ в 16-битной DOS. В Windows у вас есть стек размером 1 МБ, и вы можете выделить еще больше. Почему вы пытаетесь переключить стеки?

Как упоминал Грег, безопасным и поддерживаемым способом обмена стеками, подобными этому, в Windows является CreateFiber / SwitchToFiber. У этого действительно есть побочный эффект изменения всего вашего контекста, поэтому это не похоже на простое переключение стека.

Это действительно поднимает вопрос о том, что вы хотите сделать. Часто переключение стека происходит из-за ограниченного пространства стека, которое составляло 64 КБ в 16-битной DOS. В Windows у вас есть стек размером 1 МБ, и вы можете выделить еще больше. Почему вы пытаетесь переключить стеки?

Как упоминал Грег, безопасным и поддерживаемым способом обмена стеками, подобными этому, в Windows является CreateFiber / SwitchToFiber. У этого действительно есть побочный эффект изменения всего вашего контекста, поэтому это не похоже на простое переключение стека.

Это действительно поднимает вопрос о том, что вы хотите сделать. Часто переключение стека происходит из-за ограниченного пространства стека, которое составляло 64 КБ в 16-битной DOS. В Windows у вас есть стек размером 1 МБ, и вы можете выделить еще больше. Почему вы пытаетесь переключить стеки?

что было 64 КБ на 16-битной DOS. В Windows у вас есть стек размером 1 МБ, и вы можете выделить еще больше. Почему вы пытаетесь переключить стеки?

что было 64 КБ на 16-битной DOS. В Windows у вас есть стек размером 1 МБ, и вы можете выделить еще больше. Почему вы пытаетесь переключить стеки?

9
ответ дан 6 December 2019 в 15:29
поделиться

Безусловно, самый безопасный способ сделать это - перенести код на официальные структуры мультипрограммирования Win32, такие как потоки или волокна. Волокна обеспечивают очень легкую парадигму с несколькими стеками, которая кажется подходящей для вашего приложения.

Статья Почему Win32 вообще имеет волокна? - тоже интересное чтение.

5
ответ дан 6 December 2019 в 15:29
поделиться

Я сделал это в пользовательском режиме, и, похоже, проблем не возникло. Вам не нужен cli / sti, эти инструкции просто предотвращают прерывания в этой точке кода, что должно быть ненужным из-за ограниченной информации, которую вы нам сообщили.

0
ответ дан 6 December 2019 в 15:29
поделиться

Взгляните на Mtasker Берта Хьюберта. Он выполняет простую совместную многозадачность, вам может быть легко использовать его для переноса кода.

0
ответ дан 6 December 2019 в 15:29
поделиться

Не забывайте, что прыгающие стеки собирают все аргументы или резидентные переменные.

0
ответ дан 6 December 2019 в 15:29
поделиться
Другие вопросы по тегам:

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