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

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

Восстановить пароль Регистрация
 
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
16.12.2011, 23:36     Борьба за ресурсы #1
Добрый день! Встал вопрос, возможно надуманный.
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);
Логика такая, функция хранится где-то в одном экземпляре. Если один кусок дергать из разных потоков, то будут какие-то блокировки, борьба за память и тому подобное. Это так или нет?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2011, 23:36     Борьба за ресурсы
Посмотрите здесь:

C++ Ресурсы
C++ Борьба за кириллицу в MS Visual C++ 6.0
Борьба с утечками памяти C++
Экономия памяти или борьба с точками. (что-то типа массива ссылок хотелось бы иметь) C++
полезные ресурсы C++
Классовая борьба C++
C++ Игра "Борьба за жизнь". Цель игры – убрать с доски все шашки противника
Борьба с поеданием памяти оператором new C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
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 минуты
Добавлю еще что файлы с дампом одинакового размера.
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
17.12.2011, 14:08  [ТС]     Борьба за ресурсы #3
Проверка проверкой... кто знает, что сделает компилятор сейчас, а что потом. Меня больше интересовала теория. Каждый поток работает с разными кусками памяти или с одним, если они вызывают одну функцию?
Yandex
Объявления
17.12.2011, 14:08     Борьба за ресурсы
Ответ Создать тему
Опции темы

Текущее время: 02:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru