Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
KuKu
1558 / 1036 / 78
Регистрация: 17.04.2009
Сообщений: 2,985
#1

Борьба за ресурсы - C++

16.12.2011, 23:36. Просмотров 383. Ответов 2
Метки нет (Все метки)

Добрый день! Встал вопрос, возможно надуманный.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void* a(void* argv)
{
  while(1)
  { 
    cout << (char*)argv;
  }
}
void* b(void* argv)
{
  while(1)
  { 
    cout << (char*)argv;
  }
}
Будет ли
C++
1
2
3
  char str[] = "abcdefgh";
  pthread_create(&h1, NULL, a, (void*)str);
  pthread_create(&h2, NULL, b, (void*)str);
быстрее чем
C++
1
2
3
  char str[] = "abcdefgh";
  pthread_create(&h1, NULL, a, (void*)str);
  pthread_create(&h2, NULL, a, (void*)str);
Логика такая, функция хранится где-то в одном экземпляре. Если один кусок дергать из разных потоков, то будут какие-то блокировки, борьба за память и тому подобное. Это так или нет?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2011, 23:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Борьба за ресурсы (C++):

Классовая борьба - C++
Visual Studio 10 express ни с того ни с сего начал ругаться на существующие классы, хотя раньше воспринимал все нормально.. с чем может...

Борьба с утечками памяти - C++
Знаю, что вроде бы есть дополнения к Студии, с помощью которых можно отслеживать утечки.... Или подскажите как это можно сделать...

Борьба за кириллицу в MS Visual C++ 6.0 - C++
Для того, что бы выводились символы русского алфавита я знаю такой метод: #include &lt;iostream.h&gt; #include &lt;windows.h&gt; // для...

Борьба с поеданием памяти оператором new - C++
Здравствуйте! Столкнулся с некоторой проблемкой, решение ей не получилось найти. Может у Вас получится. Имеется код: subset...

Борьба с погрешностью при сравнивании double с int - C++
В моей программе происходит много действий с вещественными числами, а потом ответ (тоже вещественное число) сравнивается с целочисленным...

Экономия памяти или борьба с точками. (что-то типа массива ссылок хотелось бы иметь) - C++
У меня есть объект Point. И есть Объект Grup. В объекте Grup я выделил динамически память под массив объектов типа Point. Чтоб, как бы...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alkagolik
Заблокирован
17.12.2011, 03:17 #2
а написать программу проверить? вроде же форум не для обсуждения футбольных новостей. Подход был следующим. Скомпилировал 2
программы
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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
 
void* a(void* argv)
{
    char *t = argv;
    while( *t ){
        printf ( "h1=%s \n", t );
        ++t;
    }
}
void* b(void* argv)
{
    char *t = argv;
    while( *t ){
        printf ( "h2=%s \n", t );
        ++t;
    }
}
 
int main(void)
{
    char *str = "this is a string";
    pthread_t h1, h2;
 
    if ( pthread_create ( &h1, NULL, a, str ) ){
        printf ( "%s", strerror ( errno ) );
        exit ( EXIT_FAILURE );
    }
    if ( pthread_create ( &h2, NULL, a, str ) ){
        printf ( "%s", strerror ( errno ) );
        exit ( EXIT_FAILURE );
    }
 
    if ( pthread_join ( h1, NULL ) ){
        printf ( "%s", strerror ( errno ) );
        exit ( EXIT_FAILURE );
    }
    if ( pthread_join ( h2, NULL ) ){
        printf ( "%s", strerror ( errno ) );
        exit ( EXIT_FAILURE );
    }
 
    exit ( EXIT_SUCCESS );
}
в разных вариантах со всеми оптимизациями. Менял только имена функции в pthread_create(). Далее скрипт с использованием gnu binary utilites для обоих бинарников с перенаправлением stdout. наспех написанный
test.c
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
 
/*
void* a(void* argv)
{
    char *t = argv;
    while( *t ){
        printf ( "h1=%s \n", t );
        ++t;
    }
}
void* b(void* argv)
{
    char *t = argv;
    while( *t ){
        printf ( "h2=%s \n", t );
        ++t;
    }
}*/
 
int main(void)
{
    /*char *str = "this is a string";
    pthread_t h1, h2;
 
    if ( pthread_create ( &h1, NULL, a, str ) ){
        printf ( "%s", strerror ( errno ) );
        exit ( EXIT_FAILURE );
    }
    if ( pthread_create ( &h2, NULL, a, str ) ){
        printf ( "%s", strerror ( errno ) );
        exit ( EXIT_FAILURE );
    }
 
    if ( pthread_join ( h1, NULL ) ){
        printf ( "%s", strerror ( errno ) );
        exit ( EXIT_FAILURE );
    }
    if ( pthread_join ( h2, NULL ) ){
        printf ( "%s", strerror ( errno ) );
        exit ( EXIT_FAILURE );
    }*/
 
    size_t const size = 200;
    int n = size / sizeof(int);
    int null_array[ n ];
    unsigned char buf_from_aa[ size ];
    unsigned char buf_from_ab[ size ];
    unsigned char buf[ size + 1 ];
    char *str1 = "/home/deadman/file1.txt";
    char *str2 = "/home/deadman/file2.txt";
    int i = 0;
    FILE *f_ab, *f_aa;
    buf[ size ] = 0;
 
    while ( i < n ){
        null_array[ i ] = 0;
        ++i;
    }
 
    if ( ( f_ab = fopen ( str1, "r" ) ) == NULL ) {
        printf ( "%s", strerror ( errno ) );
        exit ( -1 );
    }
 
    if ( ( f_aa = fopen ( str2, "r" ) ) == NULL ) {
        printf ( "%s", strerror ( errno ) );
        exit ( -2 );
    }
 
    while ( !feof( f_aa ) )
    {
        memcpy( buf_from_aa, null_array, size );
        memcpy( buf_from_ab, null_array, size );
        memcpy( buf, null_array, size );
 
        if ( ( fgets( buf_from_aa, size, f_aa ) != NULL ) && (fgets( buf_from_ab, size, f_ab )) != NULL )
        {
            i = 0;
            while ( i < size )
            {
                if ( buf_from_aa [ i ] != buf_from_ab[ i ] ){
                    printf ( "\nбуфер а + а" );
                    memcpy ( buf, buf_from_aa, size );
                    printf ( "%s\n", buf );
                    printf ( "буфер а + b" );
                    memcpy ( buf, buf_from_ab, size );
                    printf ( "%s", buf );
                }
                ++i;
            }
        }
    }
 
    fclose( f_aa );
    fclose( f_ab );
 
    exit ( EXIT_SUCCESS );
}
, вывод
консоли
буфер а + а 8048630: c7 44 24 08 5a 87 04 movl $0x804875a,0x8(%esp)

буфер а + b 8048630: c7 44 24 08 25 87 04 movl $0x8048725,0x8(%esp)

буфер а + а 8048630: c7 44 24 08 5a 87 04 movl $0x804875a,0x8(%esp)

буфер а + b 8048630: c7 44 24 08 25 87 04 movl $0x8048725,0x8(%esp)

буфер а + а 8048630: c7 44 24 08 5a 87 04 movl $0x804875a,0x8(%esp)

буфер а + b 8048630: c7 44 24 08 25 87 04 movl $0x8048725,0x8(%esp)

буфер а + а 8048630: c7 44 24 08 5a 87 04 movl $0x804875a,0x8(%esp)

буфер а + b 8048630: c7 44 24 08 25 87 04 movl $0x8048725,0x8(%esp)

Process returned 0 (0x0) execution time : 0.004 s

. Дальнейшие импровизации и анализ оставляю вам. Просьба не судить исходник . Сложность задачи не требует труЪ подхода.

Добавлено через 4 минуты
Добавлю еще что файлы с дампом одинакового размера.
1
KuKu
1558 / 1036 / 78
Регистрация: 17.04.2009
Сообщений: 2,985
17.12.2011, 14:08  [ТС] #3
Проверка проверкой... кто знает, что сделает компилятор сейчас, а что потом. Меня больше интересовала теория. Каждый поток работает с разными кусками памяти или с одним, если они вызывают одну функцию?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2011, 14:08
Привет! Вот еще темы с ответами:

Игра "Борьба за жизнь". Цель игры – убрать с доски все шашки противника - C++
Здравствуйте! Помогите пожалуйста написать программу на с++. Два игрока имеют по n шашек и играют в поле m m клеток, делая ходы по...

Ресурсы - C++
Подскажите каким образом можно открыть для чтения ресур? нужно открыть так чтобы можно было читать функцией ReadFile(); Смог сделать...

полезные ресурсы - C++
Доброго времени суток. Недавно начал изучать с++ и хочу поинтересоваться у более опытных. Какие полезные ресурсы в изучении, обсуждении Вы...

Как присоединять ресурсы? - C++
Есть некоторый массив данных довольно большого размера, чтобы превращать его в числа и писать прямо в коде инициализацию массива....


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

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

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