Неожиданное поведение pthread_cond_broadcast

Вы читаете сокет до тех пор, пока read() не вернет -1. Это условие конца потока (EOS). EOS происходит, когда партнер завершает соединение. Не когда он заканчивает запись одного файла.

Вам нужно отправить размер файла перед каждым файлом. Вы уже делаете подобное с количеством файлов. Затем убедитесь, что вы прочитали точно столько байтов для этого файла:

String filename = dis.readUTF();
long fileSize = dis.readLong();
FileOutputStream fos = new FileOutputStream(filename);
while (fileSize > 0 && (n = dis.read(buf, 0, (int)Math.min(buf.length, fileSize))) != -1)
{
  fos.write(buf,0,n);
  fileSize -= n;
}
fos.close();

Вы можете заключить все это в цикл, который завершается, когда readUTF() выбрасывает EOFException. Наоборот, вы должны вызывать writeUTF(filename) и writeLong(filesize) у отправителя перед отправкой данных.

-1
задан Imago 17 January 2019 в 17:35
поделиться

1 ответ

Вызов pthread_cond_signal () разблокирует хотя бы один из потоков, которые заблокированы в указанной условной переменной cond (если какие-либо потоки заблокированы на cond).

Вызов pthread_cond_broadcast () разблокирует все потоки, заблокированные в данный момент в указанной условной переменной cond.

Если в условной переменной заблокировано более одного потока, политика планирования определяет порядок , в котором потоки разблокированы.

Более подробную информацию о политиках планирования можно найти здесь .

0
ответ дан Imago 17 January 2019 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: