
По сути, мне нужно выполнить некоторые требования. Первый заключался в вычислении этой иерархии.
Второй был основан на синхронизации потоков одного и того же процесса. Это было требование:
Процесс P7 должен создать 5 потоков: T7.1, T7.2, ..., T7.5. Вы должны наложить на выполнение потоков процесса P7 следующие условия синхронизации:
• Основной поток процесса, т. е. T7.0 не должен завершаться раньше остальных 5 потоков. Это означает, что его сообщение «info(END, ...)» не должно вызываться раньше аналогичных вызовов других потоков. Что касается сообщений, его сообщение END никогда не должно отображаться перед любым сообщением END других потоков.
• Поток T7.1 должен запускаться до запуска T7.5 и завершаться после завершения T7.5.Мне удалось сделать эти два, но теперь я застрял на третьем, а именно: синхронизация потоков разных процессов. Меня спрашивают следующее: Процесс P3 должен создать 6 потоков: T3.1, T3. .2, ..., Т3.6. Вы должны наложить на выполнение потоков процессов P3 и P7 следующие условия синхронизации:
• Основной поток процесса, т.е. T3.0 не должен завершаться раньше других 6
потоков.
• Поток T3.3 должен завершиться до запуска T7.2, а T3.4 должен запуститься
только после завершения T7.2.
Функция «info()» в основном ( по крайней мере, с вашей точки зрения) отображает сообщение. Если мы находимся в начале или конце потока/процесса, номер процесса и номер потока.
Я пытался использовать ту же логику и некоторую помощь, которую нашел на этом сайте, который использует «общие» семафоры:
Код: Выделить всё
sem_t *semaphore = mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS, -1, 0);
if (semaphore == MAP_FAILED || sem_init(semaphore, 1, 0) == -1) {
perror("Semaphore initialization failed");
exit(EXIT_FAILURE);
}
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include
#include "a2_helper.h"
sem_t sem_thread1, sem_thread5;
sem_t sem_thread3_3, sem_thread7_2;
sem_t test, test1;
void *thread1(void *arg) {
int thread_num = ((int)arg);
info(BEGIN,7,thread_num);
sem_post(&sem_thread1);
sem_wait(&sem_thread5);
info(END,7,thread_num);
pthread_exit(NULL);
}
void *thread5(void *arg) {
int thread_num = ((int)arg);
sem_wait(&sem_thread1);
info(BEGIN,7,thread_num);
info(END,7,thread_num);
sem_post(&sem_thread5);
pthread_exit(NULL);
}
void *dummy_thread(void *arg) {
// Dummy thread function
int thread_num = ((int)arg);
info(BEGIN,7,thread_num);
info(END,7,thread_num);
pthread_exit(NULL);
}
void *dummy_thread2(void *arg) {
// Dummy thread function
int thread_num = ((int)arg);
info(BEGIN,3,thread_num);
info(END,3,thread_num);
pthread_exit(NULL);
}
int main() {
pthread_t threads[5];
//pthread_t threads2[50];
pthread_t threads3[50];
int thread_nums[50];
for(int i=0; i
Подробнее здесь: [url]https://stackoverflow.com/questions/78429124/synchronizing-threads-from-different-processes-linux-c[/url]