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

С под Linux

Войти
Регистрация
Восстановить пароль
 
wad1970
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 3
#1

Читающий поток мешает пишущему? - C Linux

24.01.2017, 14:32. Просмотров 252. Ответов 6
Метки нет (Все метки)

Есть 2 потока.
В одном сформированный массив переносим в массив DataDT
C
1
memcpy(&DataDT[Num].AccTime,&RecePack[3],100);
В другом проверяем DataDT[0].AccTime==0
Если оградить их Mutex-ами то всё нормально, в противном случае DataDT[Num] - полностью сдвигается на 1 байт - почему так может быть? ведь во втором потоке я ничего не пишу в него?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2017, 14:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Читающий поток мешает пишущему? (C Linux):

Метод, читающий входной поток - Java SE
Есть программа из Шилдта. Пишу её в Eclipse. public class Menu { public static void main(String Arhs) throws...

Метод, читающий входной поток и вычисляющий контрольную сумму прочитанных данных - Java SE
Помогите, пожалуйста, с заданием. Как это сделать? Напишите метод, читающий входной поток и вычисляющий контрольную сумму прочитанных...

Метод, читающий входной поток и вычисляющий контрольную сумму прочитанных данных - Java SE
Здравствуйте. Очень нужна помощь в решении задачи. Она вроде простая, но я что-то ничего не понимаю! Уже мозг плавится! Вот условие: ...

Новый поток мешает открытию новой формы - C#
У меня есть поток, после выполнения которого не открывается новая форма. Пробовал просто вызывать функцию без потока тогда все работает....

Поток освобождается, но переменная, которой был присвоен этот поток, не очищается - Delphi
Мне интересно, вот поток отработал, стоит FreeOnTerminate:=True; Поток освобождается, но переменной которой было присвоен этот поток, не...

Создал поток. В нем выделил буффер. Поток выполнился, но из за буфера ругнулся. - C++
В функции треда создал буфер char tbuf;но после того как тред выполнился выскочила ошибка Run-Time Check Failure #2 - Stack around the...

6
grgdvo
613 / 544 / 163
Регистрация: 02.09.2012
Сообщений: 1,608
24.01.2017, 17:25 #2
приведите код целиком.
1
HighPredator
5603 / 1917 / 358
Регистрация: 10.12.2010
Сообщений: 5,569
Записей в блоге: 3
25.01.2017, 08:08 #3
Цитата Сообщение от wad1970 Посмотреть сообщение
Если оградить их Mutex-ами то всё нормально, в противном случае DataDT[Num] - полностью сдвигается на 1 байт - почему так может быть?
C
1
memcpy(&DataDT[Num].AccTime,&RecePack[3],100);
Значит скорее всего у вас на момент записи изменяется значение Num
1
wad1970
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 3
25.01.2017, 11:01  [ТС] #4
Спасибо что откликнулись, всё же причина оказалась в самом memcpy.
Видимо memcpy не могло работать с адресом &DataDT[Num].AccTime не выровненным по границе слова,
а когда сделал
C
1
memcpy(&DataDT[Num],&RecePack[2],100);
то всё ОК

Добавлено через 4 минуты
А структура вот такая была
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct
{
  u8 Num;
  u16 TimeAcc;
  u8  Work_Sensor[MAX_QN_DT];   // массив неисправностей каналов
      //0 - канал исправен
      //1 - обрыв рамки
      //2 - генерация канала
  u16 Intensity[MAX_QN_DT];     // 
  u16 IntenLorry[MAX_QN_DT];    //
  u16 TimePresence[MAX_QN_DT];  //
  u8  AverVelo[MAX_QN_DT];      // 
} t_DataDT;
extern t_DataDT DataDT[4];    //
0
HighPredator
5603 / 1917 / 358
Регистрация: 10.12.2010
Сообщений: 5,569
Записей в блоге: 3
25.01.2017, 11:22 #5
Вряд ли. memcpy штука тупая в том смысле, что ей плевать как выравнены данные, с которыми она работает. Мне интересно другое: зачем вы 100 байт копировали в поле u16?
0
wad1970
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 3
26.01.2017, 05:50  [ТС] #6
Начиная с поля u16 я обновлял всю структуру, на самом деле там не 100 байт, а sizeof(DataDT)-1 написано было.
Может потому и выравнивалось , что адрес приёмника - &u16.
0
HighPredator
5603 / 1917 / 358
Регистрация: 10.12.2010
Сообщений: 5,569
Записей в блоге: 3
26.01.2017, 07:43 #7
Давайте релевантный код, а то гадание на кофейной гуще получается.
0
26.01.2017, 07:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2017, 07:43
Привет! Вот еще темы с ответами:

Ошибка-Текущий поток должен быть задан как поток однопоточного контейнера STA - PascalABC.NET
Значит модуль в нем классы.Я создаю свое гуи.Так вот при вызове процедуры котрая копирует текст(в буфер) вылезает эта ошибка я уже с ней...

Разработать программу, в которой основной поток, принимает поток ввода и контролирует созданные потоки. - C++ Linux
что-то не-то с кодом. 2 дня ломаю голову :( //#define _REENTRANT #include <stdio.h> #include <stdlib.h> #include <iostream> ...

OpenFileDialog и потоки: Текущий поток должен быть задан как поток однопоточного контейнера (STA) - C#
Со стартового окна запускаю формы вот так: new Thread(() => { ...

Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток)) - C++ Builder
Помогите пожалуйсмта))))) Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток))


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

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

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