LINUX.ORG.RU

Бесконечный цикл, работающей одновременно с выполнением остальных операндов

 


2

1

Я начал знакомиться с языком Си,и у меня возник вопрос: как сделать бесконечный цикл, работающей одновременно с выполнением остальных операндов. Поможете?

pthread

thread/

Или если не то, то


while(true)
{
   Делаю тут что-то
   while(true)
   {
      Делаю тут что-то
   }
   Делаю тут что-то
}

Или если нет то, то

Делаю тут что-то 

#pragma omp parallel for
for(...)
{
  делаю тут что-то
}
одновременно с тем что делаю тут

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)

Скорее всего ты можешь просто выполнять эти операнды прямо в цикле.

Deleted
()
Ответ на: комментарий от Deleted

Только так что бы они не мешали циклу конечно же.

Deleted
()

Очевидные-невероятные потоки.

Korchevatel ★★★★★
()

Я начал знакомиться с языком Си

Только начал, а уже на бред какой то понесло.

Deleted
()

Ты пример кода дай, что ты хочешь что-бы работало «одновременно» и да, сразу в параллельное программирование лучше не совать нос, ну разве что просто поиграться.

Deleted
()
Ответ на: комментарий от Deleted

сразу в параллельное программирование лучше не совать нос

Лучше в асинхронное податься!

Deleted
()
Ответ на: комментарий от Deleted

Ну почему же бред, вот то что рановато это да (если реально только начал он), а так здоровый интерес всегда похвален. Тыкать палочкой никто не запрещает и всячески приветствуется всегда и везде.

Deleted
()
Ответ на: комментарий от Deleted

Ты хочешь что бы он сразу в дурку определился? Пусть для начала ровно по одному канату научится ходить, а уже потом прыгать по ним будет.

Deleted
()
Ответ на: комментарий от Deleted

Ну почему же бред

Ты пример кода дай

Вот именно поэтому. ТС вряд ли осознаёт, куда его несёт. А это уже бред.

Deleted
()
Ответ на: комментарий от Deleted

Асинхронное же более привычное, задаешь компьютеру задачи, он их решает, а не ждешь пока он решит... и потом диктуешь что там далее.

Deleted
()
Ответ на: комментарий от Deleted

Ну я толком не знаю что именно он хочет, вангую что просто цикл в цикле, а слово «одновременно» чисто для вида.

Deleted
()
Ответ на: комментарий от Deleted

И вообще, лучше написать код и потом ехать в дурку, чем одновременно ехать в дурку и писать код! %)

Deleted
()
Ответ на: комментарий от Deleted

Ага, особенно когда у тебя 6823 задачи и каждая требует состояния и не дай бог если где то там зависимость. В целом, да порой это просто нереально удобно. Но, порой просто берёшь и мозг аккуратно на полочку и пьёшь ромашковый чай

Deleted
()
#include<condition_variable>
#include<mutex>
#include<thread>
#include<unistd.h>
int main(){
std::condition_variable co;
std::mutex mu;
std::unique_lock lk(mu);
std::thread th([&]{
  while(1){
    co.wait(lk);
    puts("thread");}});
while(1){
  puts("main");
  co.notify_one();
  sleep(1);}}
anonymous
()
Ответ на: комментарий от Deleted

Да. Но лучше вообще не ехать в дурку, а писать однопоточный код. А уже набив шишки пользоваться фичами OC в виде многопоточности, в той или иной реализации.

Deleted
()
Ответ на: комментарий от Deleted

while(true) …{ while(true) …

UDP: естественно цикл внутренний не должен быть вечным, а иметь break раз в период времени к примеру или использовать for с счётчиком. Ну ты понял, если всё оставлять именно так то можно уверенно сказать что я сморозил тупость и послать мне лучи негодования и ты будешь абсолютно прав.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Caesium137

:D

for(int i=0; i < 100; i++)
{
  printf("Hello World %i",i);
}
Deleted
()
Ответ на: комментарий от Caesium137

Ну или так

#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>

int main(int argc, char *argv[])
{
   pid_t pid  = fork();

   if(pid == -1)
   {
       printf("error");
       return pid;
   };
   /*дочка*/
   if(pid == 0)
   {
        while(true)
        {
            printf("Hello world\n");
        };
   /*родитель*/
   }else{
        int x=0;
        while(true)
        {
            printf("x=%i\n",x++);
        };
   };
    return 0;
}

Есть иные варианты и их много.

https://ru.wikipedia.org/wiki/OpenMP

https://ru.wikipedia.org/wiki/OpenACC

https://ru.wikipedia.org/wiki/POSIX_Threads

https://ru.wikipedia.org/wiki/Fork

Deleted
()
Последнее исправление: Deleted (всего исправлений: 3)
Ответ на: комментарий от Deleted

Ну и конечно же нативная параллельность С11

#include <threads.h>
#include <stdio.h>
#include <stdbool.h>

int run1(void *arg)
{
    printf("[1]Hello world of C11 threads.");
    while(true)
    {
        printf("hello world\n");
    }
    return 0;
}

int run2(void *arg)
{
    printf("[2]Hello world of C11 threads.");
    int x = 0;
    while(true)
    {
        printf("x=%i\n",x++);
    }
    return 0;
}


int main(int argc, const char *argv[])
{
    thrd_t thread1,thread2;

    thrd_create(&thread1, run1, NULL);
    thrd_create(&thread2, run2, NULL);

    thrd_join(thread1, NULL);
    thrd_join(thread2, NULL);

}

К сожалению, реализовывать мало кто скачет, поэтому если побыстрому то musl

 musl-gcc th.c -std=c11 ; ./a.out
Deleted
()
Ответ на: комментарий от Deleted

Спасибо!

Я все это спрашиваю только ради интереса

Caesium137
() автор топика

Остальные операнды лучше выполнить после завершения бесконечного цикла, так будет быстрее.

d_a ★★★★★
()
Ответ на: комментарий от MKuznetsov

Это сарказм был? Ибо без exec, vfork не даёт параллельности.

vodz ★★★★★
()
Ответ на: комментарий от Deleted

#pragma omp parallel for

Вообще то openmp это spmd у тебя все что вне omp regionа будет выполнено только после окончания omp regionа если ты спец клауз не поставишь

lberserq
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.