LINUX.ORG.RU

C/C++ потоки


0

0

Возможно ли в С или С++ создавать потоки в стиле питона, т.е. не привязываясь жестко к кол-во потоков, типа pthread_t thread1, thread2;.
Для примера - приходит сообщение в жаббер и на его основе порождается поток в котором выполняется определенная функция.

Если не сложно то дайте линк на примеры и документация по потокам для начинающих

советую познакомится с динамическими структурами данных, для начала.

anonymous
()
Ответ на: комментарий от rg-400

Ok. Но в этом примере потоки создаются используя это объявление:
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
void * thread_func(void *arg)
{ int i;
int loc_id = * (int *) arg;
for (i = 0; i < 4; i++) {
printf(«Thread %i is running\n», loc_id);
sleep(1);
}
}
int main(int argc, char * argv[])
{ int id1, id2, result;
pthread_t thread1, thread2;
id1 = 1;
result = pthread_create(&thread1, NULL, thread_func, &id1);
if (result != 0) {
perror(«Creating the first thread»);
return EXIT_FAILURE;
}
id2 = 2;
result = pthread_create(&thread2, NULL, thread_func, &id2);
if (result != 0) {
perror(«Creating the second thread»);
return EXIT_FAILURE;
}
result = pthread_join(thread1, NULL);
if (result != 0) {
perror(«Joining the first thread»);
return EXIT_FAILURE;
}
result = pthread_join(thread2, NULL);
if (result != 0) {
perror(«Joining the second thread»);
return EXIT_FAILURE;
}
printf(«Done\n»);
return EXIT_SUCCESS;


Мне интересно можно ли порождать потоки динамически, не зная сколько их будет максимально

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

да!
только как это делать решать программисту:
в си динамический массив, список, дерево, что хочешь

rg-400
()
Ответ на: комментарий от BliecanBag

Можно, всего-то навсего надо хранить идентификаторы потоков в последовательности с динамически изменяемой длиной.

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

а вас плохо с пониманием программирования и языка в частности. попробую помочь.

Но в этом примере потоки создаются используя это объявление

правильно. но при чем здесь ограничения на количество потоков?
объявляется переменнаяж, которая используется лишь для того, чтобы сохранить PID.
его можно больши и не хранить, если PID нигде больше не будет нужен.
хоть 1000 потоков создавай с сохранением PID-ов в одну эту переменную...

Мне интересно можно ли порождать потоки динамически, не зная сколько их будет максимально

легко. всё, что ты напишешь, то и будет выполняться. главное - осознавать, что ты пишешь. а для этого надо книги читать!

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

пардон за мой русский... что-то пальцы не слушаются сегодня...

xydo ★★
()

Мвахахахаа, нуб не осилил динамическую аллокацию.

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

Ты пост почитай. Он просто не знает, как элементарные структуры данных юзать :)

anonymous
()

На Qt это будет выглядеть так:

class MyTask : public QRunnable
{
public:
    void run()
    {
        // do something
    }
};

void messageReceived()
{
    QThreadPool::globalInstance()->start( new MyTask );
}
Dendy ★★★★★
()
Ответ на: комментарий от BliecanBag

Пример чего? Последовательностей с динамически изменяемой длиной? За этим - в любую книгу по базовым структурам данных. За тем читать Керигана и Ричи, чтобы выучить язык на котором пытаешься писать.

Begemoth ★★★★★
()

Ты наркоман чтоле? Что мешает то создавать их?

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>

void* ThreadFunc(void* param);

pthread_mutex_t g_mutex;

void main(void)
{
    pthread_mutex_init(&g_mutex, NULL);
    for(int i = 0; i<INT_MAX; ++i)
    {
        getchar();
        pthread_t id;
        pthread_create(&id, NULL, ThreadFunc, (void*)i);
    }    
}

void* ThreadFunc(void* param)
{
    pthread_mutex_lock(&g_mutex);
    printf("Thread number %d started\n", (int)param);
    pthread_mutex_unlock(&g_mutex);
    return NULL;
}

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

(let ((threads (loop :repeat 100 :collect (bt:make-thread #'worker))))
(loop :while (some #'bt:thread-alive-p threads)
:do (bt:thread-yield)))

Так неправильно, а вот так правильно:

(mapcar #'bt:join-thread (loop repeat 100 collect (bt:make-thread #'worker))
dmitry_vk ★★★
()
Ответ на: комментарий от dmitry_vk

>bt:join-thread

А bt:thread-yield разве не надо будет внутри каждого потока периодично вызывать? А то мне в своё время в lisp@c.j.r на этот вопрос так и не ответили :)

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

Ну, чтобы дать и другим потокам работать. Просто из документации к BT я всё понял именно так :)

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

>Ну, чтобы дать и другим потокам работать.

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

Семантика этой функции такова, что ее можно безопасно заменить на noop.

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

dmitry_vk ★★★
()

Возможно ли в С или С++ создавать потоки в стиле питона, т.е. не привязываясь жестко к кол-во потоков, типа pthread_t thread1, thread2;. Для примера - приходит сообщение в жаббер и на его основе порождается поток в котором выполняется определенная функция.

man thread pooling

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