Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
19 / 15 / 7
Регистрация: 27.02.2012
Сообщений: 742
1

Pthread, поток, передающий значение по указателю

17.10.2014, 23:16. Просмотров 1910. Ответов 9
Метки нет (Все метки)

Создаётся поток, передающий значение по указателю:

C++
1
2
pthread_create (&pthread_id1, NULL, my_thread,(void *)arr);
pthread_create (&pthread_id2, NULL, my_thread,arr+100*sizeof(int));
сюда передаёт:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void * my_thread (void *arg){
 
    int* value = (int*) arg;
printf("\nMax element of array = %d", &value);
/*
int max = 0;
 
for(int i = 0; i < 1000; ++i)
        {
            if(arr[i] > max)
            {
                max = arr[i];
            }}*/
return (NULL);
}
Однако фигню какую-то и не ясно почему, нужна помощь опытных ботаников.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h> 
void * my_thread (void *arg){
 
    int* value = (int*) arg;
printf("\nMax element of array = %d", &value);
/*
int max = 0;
 
for(int i = 0; i < 1900; ++i)
        {
            if(arr[i] > max)
            {
                max = arr[i];
            }}*/
return (NULL);
}
 
int main(void)
{
pthread_t pthread_id1, pthread_id2, pthread_id3, pthread_id4, pthread_id5, pthread_id6, pthread_id7, pthread_id8, pthread_id9, pthread_id0;
int *arr = new int[1000];
 
srand(time(NULL));
for (int i=0;i<1000;i++){
    arr[i]=rand()%1000;}
 
printf("Max element of array: %d \n", arr[0]);
printf("Max element of array: %d", arr[100]);
 
pthread_create (&pthread_id1, NULL, my_thread,(void *)arr);
pthread_create (&pthread_id2, NULL, my_thread,arr+100*sizeof(int));
/*pthread_create (&pthread_id3, NULL, my_thread,(void *)c);
pthread_create (&pthread_id4, NULL, my_thread,(void *)ch4);
pthread_create (&pthread_id5, NULL, my_thread,(void *)ch4);
pthread_create (&pthread_id6, NULL, my_thread,(void *)ch4);
pthread_create (&pthread_id7, NULL, my_thread,(void *)ch4);
pthread_create (&pthread_id8, NULL, my_thread,(void *)ch4);
pthread_create (&pthread_id9, NULL, my_thread,(void *)ch4);
pthread_create (&pthread_id0, NULL, my_thread,(void *)ch4);
pthread_join (pthread_id0, NULL);*/
_getch();
return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.10.2014, 23:16
Ответы с готовыми решениями:

Pthread взывать поток без параметров
void RunClient(){ int iret; const char *message = &quot;Thread Run_Client()&quot;; if...

Можно ли убить поток (pthread) сигналом (kill()) ?
Процесс убивается вызовом kill(pid, 9); Как убить не весь процесс а только поток? Можно...

Как узнать, что поток закончился (библиотека pthread)?
Друзья! Есть ли какая-нибудь pthread-функция, которая вызывается в основном потоке X и показывает-...

Передача в поток многомерных массивов по указателю
Доброго всем времени суток. У меня возникло непонимание того, как можно передать двумерный...

9
13475 / 7138 / 1712
Регистрация: 30.01.2014
Сообщений: 11,941
18.10.2014, 02:57 2
Лучший ответ Сообщение было отмечено Satansoft как решение

Решение

Цитата Сообщение от Satansoft Посмотреть сообщение
printf("\nMax element of array = %d", &value);
Цитата Сообщение от Satansoft Посмотреть сообщение
Однако фигню какую-то и не ясно почему
Выводишь адрес указателя своего ты.
Разыменования вместо, операцию адреса взятия применил ты.


Цитата Сообщение от Satansoft Посмотреть сообщение
arr+100*sizeof(int)
Чтобы сотый элемент массива получить, на sizeof(int) домножать не нужно, ибо адресная арифметика уже учитывает размер элемента.
0
19 / 15 / 7
Регистрация: 27.02.2012
Сообщений: 742
18.10.2014, 03:16  [ТС] 3
огромная признательность Доктору Йоде за напутствие и дабы не плодить темы, последний вопросъ:

Как передать сие:

C++
1
2
3
4
5
int *arr = new int[1000];
 
srand(time(NULL));
for (int i=0;i<1000;i++){
    arr[i]=rand()%1000;}
Сюдым:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void * my_thread (void *arg){
 
    int* value = (int*) arg;
printf("\nMax element of array = %d", &value);
 
int max = 0;
 
for(int i = 0; i < 1000; ++i)
        {
            if(arr[i] > max)
            {
                max = arr[i];
            }}
return (NULL);
}
0
13475 / 7138 / 1712
Регистрация: 30.01.2014
Сообщений: 11,941
18.10.2014, 13:31 4
Satansoft, посмотри сюда. Таким образом можно передавать указатель на класс или структуру, в которой будут твои данные и через этот указатель уже к ним обращаться.
0
19 / 15 / 7
Регистрация: 27.02.2012
Сообщений: 742
18.10.2014, 13:57  [ТС] 5
DrOffset, понял что делать, но не понял как это у меня реализовать и можно ли вообще из мейна this передавать...
0
13475 / 7138 / 1712
Регистрация: 30.01.2014
Сообщений: 11,941
18.10.2014, 14:08 6
Цитата Сообщение от Satansoft Посмотреть сообщение
DrOffset, понял что делать, но не понял как это у меня реализовать и можно ли вообще из мейна this передавать...
Нельзя. Но принцип един:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Data
{
    // твои данные
};
 
int main()
{
    Data data;
    // какой-то код
    // ...
    pthread_create (&pthread_id1, NULL, my_thread, &data); // в my_thread приводим указатель void* к Data* и работаем - и не забываем про синхронизацию 
    
    // какой-то код
 
    // Здесь (в конце) нужно дождаться завершения запущенных потоков. 
    // иначе Data уничтожится, а поток все еще продолжит с ним работу
    // см. pthread_join
}
Добавлено через 1 минуту
Satansoft, Или просто создай класс (как в том примере) и всю работу проводи уже там, а из main ее (работу) убери.

Добавлено через 5 минут
Satansoft, кстати в man-странице по pthread_create есть хороший пример.
0
19 / 15 / 7
Регистрация: 27.02.2012
Сообщений: 742
18.10.2014, 14:46  [ТС] 7
Создал структуру, занёс в неё массив. объявил в main, выделил память и передаю из мейна в my_thread уже из структуры... короче нуб

как передать структуру так и не выяснил.. передавая по ссылке последним параметром, не ясно тогда как разделить выполнении функции между 10 потоками...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
 
struct Data{
int arr[1000];};
 
void * my_thread (void *arg){
 
    int* value = (int*) arg;
 
printf("\nMax element of array = %d", *value);
 
/*int max = 0;
 
for(int i = 0; i < 1000; ++i)
        {
            if(arr[i] > max)
            {
                max = arr[i];
            }}
printf("\nMax element of array = %d", max); */
return (NULL);
}
 
int main(void)
{
pthread_t pthread_id1, pthread_id2, pthread_id3, pthread_id4, pthread_id5, pthread_id6, pthread_id7, pthread_id8, pthread_id9, pthread_id0;
 
Data *dt = new Data[1];
 
srand(time(NULL));
for (int i=0;i<1000;i++){
    dt[0].arr[i]=rand()%1000;}
 
printf("Max element of array: %d \n", dt[0].arr[0]);
printf("Max element of array: %d", dt[0].arr[100]);
 
pthread_create (&pthread_id1, NULL, my_thread, dt[0].arr);
pthread_create (&pthread_id2, NULL, my_thread, dt[0].arr+100);
/*pthread_create (&pthread_id3, NULL, my_thread, arr+200);
pthread_create (&pthread_id4, NULL, my_thread, arr+300);
pthread_create (&pthread_id5, NULL, my_thread, arr+400);
pthread_create (&pthread_id6, NULL, my_thread, arr+500);
pthread_create (&pthread_id7, NULL, my_thread, arr+600);
pthread_create (&pthread_id8, NULL, my_thread, arr+700);
pthread_create (&pthread_id9, NULL, my_thread, arr+800);
pthread_create (&pthread_id0, NULL, my_thread, arr+900);
pthread_join (pthread_id1, NULL);
pthread_join (pthread_id2, NULL);
pthread_join (pthread_id3, NULL);
pthread_join (pthread_id4, NULL);
pthread_join (pthread_id5, NULL);
pthread_join (pthread_id6, NULL);
pthread_join (pthread_id7, NULL);
pthread_join (pthread_id8, NULL);
pthread_join (pthread_id9, NULL);
pthread_join (pthread_id0, NULL);*/
_getch();
return 0;
}
0
13475 / 7138 / 1712
Регистрация: 30.01.2014
Сообщений: 11,941
18.10.2014, 15:31 8
Цитата Сообщение от Satansoft Посмотреть сообщение
как передать структуру так и не выяснил.. передавая по ссылке последним параметром, не ясно тогда как разделить выполнении функции между 10 потоками...
Давай ты задачу сформулируешь сперва. Чего ты добиться-то хочешь?

Со структурой был совет, если ты хочешь передать сразу несколько данных, например массив и размер его.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
 
struct Data
{
    int *  data;
    size_t size;
};
 
void * my_thread(void * arg)
{
    Data * data = static_cast<Data *>(arg);
 
    printf("first: %d\n", *data->data);
 
    int max = 0;
    for(int i = 0; i < data->size; ++i)
    {
        if(data->data[i] > max)
        {
            max = data->data[i];
        }
    }
    printf("Max element of array = %d\n", max);
 
    return(NULL);
}
 
int main()
{
    pthread_t pthread_id1, pthread_id2;
    int arr[1000];
 
    srand(time(NULL));
    for (int i = 0; i < 1000; i++)
    {
        arr[i] = rand() % 1000;
    }
 
    printf("0   element of array: %d\n", arr[0]);
    printf("100 element of array: %d\n",  arr[100]);
 
    Data data1 = { &arr[0],   1000 };
    pthread_create(&pthread_id1, NULL, &my_thread, &data1);
    Data data2 = { &arr[100], 900  };
    pthread_create(&pthread_id2, NULL, &my_thread, &data2);
 
 
    pthread_join (pthread_id1, NULL);
    pthread_join (pthread_id2, NULL);
 
    return 0;
}
1
19 / 15 / 7
Регистрация: 27.02.2012
Сообщений: 742
18.10.2014, 15:45  [ТС] 9
Цитата Сообщение от DrOffset Посмотреть сообщение
Давай ты задачу сформулируешь сперва. Чего ты добиться-то хочешь?
Найти максимальный элемент массива путём параллельного его поиска в 10 потоков. И мне не ясно как это реализовать, ведь самое большее что можно, это чтобы поток искал макс. элемент части массива задав смещение.
0
13475 / 7138 / 1712
Регистрация: 30.01.2014
Сообщений: 11,941
18.10.2014, 16:09 10
Satansoft, ну вот наивная реализация (писал в браузере, опечатки, если будут, сам поправишь)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
 
struct Data
{
    int *  data;
    size_t size;
 
    int result;
};
 
void * my_thread(void * arg)
{
    Data * data = static_cast<Data *>(arg);
 
    int max = 0;
    for(size_t i = 0; i < data->size; ++i)
    {
        if(data->data[i] > max)
        {
            max = data->data[i];
        }
    }
    data->result = max;
    return(NULL);
}
 
int main()
{
    int arr[1000];
 
    srand(time(NULL));
    for (int i = 0; i < 1000; i++)
    {
        arr[i] = rand() % 1000;
    }
    size_t const threads   = 4;
    size_t const perThread = 1000 / threads;
 
    pthread_t pID[threads];
    Data data[threads];
 
    for(size_t i = 0; i < threads; ++i)
    {
        data[i].data = &arr[i * perThread];
        data[i].size = perThread;
        pthread_create(&pID[i], NULL, &my_thread, data + i);
    }
    for(size_t i = 0; i < threads; ++i)
    {
        pthread_join(pID[i], NULL);
    }
    int max = 0;
    for(size_t i = 0; i < threads; ++i)
    {
        if(data[i].result > max)
        {
            max = data[i].result;
        }
    }
    printf("Max element of array = %d\n\n", max);
 
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2014, 16:09

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

Шестнадцатеричный вывод WORD и DWORD в поток без приведения к указателю
Как сделать? Есть ли для этого потоковый манипулятор? Желательно, чтоб цифры A-F были в верхнем...

Pthread.h, как вернуть из потоковой функции значение типа double?
Всем привет. Не понимаю, как вернуть из потоковой функции значение типа double: #include...

Присвоить указателю, значение
Я новичок в программирование, прошу не пинать. У меня есть указатель void *result; и есть...

Присвоить указателю значение
Подскажите, плз, как правильно присвоить указателю значение. Вставил строку (№14), а компилятор...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.