OpenMP İşlevleri
OpenMP API'sinde kullanılan işlevlerin bağlantılarını sağlar.
OpenMP standardının Visual C++ uygulaması aşağıdaki işlevleri ve veri türlerini içerir.
Ortam yürütme için:
İşlev | Tanım |
---|---|
omp_set_num_threads | bir num_threads yan tümcesi tarafından geçersiz kılınmadığı sürece, yaklaşan paralel bölgelerdeki iş parçacığı sayısını ayarlar. |
omp_get_num_threads | Paralel bölgedeki iş parçacığı sayısını döndürür. |
omp_get_max_threads | Kodda num_threads olmayan paralel bir bölge tanımlandıysa kullanılabilir iş parçacığı sayısına eşit veya ondan büyük bir tamsayı döndürür. |
omp_get_thread_num | İş parçacığı ekibinde yürütülen iş parçacığının iş parçacığı numarasını döndürür. |
omp_get_num_procs | İşlev çağrıldığında kullanılabilen işlemci sayısını döndürür. |
omp_in_parallel | Paralel bir bölgeden çağrılırsa sıfır olmayan döndürür. |
omp_set_dynamic | Yaklaşan paralel bölgelerde kullanılabilen iş parçacığı sayısının çalışma zamanına göre ayarlanabileceğini gösterir. |
omp_get_dynamic | Yaklaşan paralel bölgelerde kullanılabilen iş parçacığı sayısının çalışma zamanına göre ayarlanabileceğini gösteren bir değer döndürür. |
omp_set_nested | İç içe paralelliği etkinleştirir. |
omp_get_nested | İç içe paralelliğin etkinleştirilip etkinleştirilmediğini gösteren bir değer döndürür. |
Kilit için:
İşlev | Tanım |
---|---|
omp_init_lock | Basit bir kilit başlatır. |
omp_init_nest_lock | Bir kilit başlatır. |
omp_destroy_lock | Kilidin başlatılmamış halini alır. |
omp_destroy_nest_lock | İç içe bir kilidi başlatmaz. |
omp_set_lock | Bir kilit kullanılabilir olana kadar iş parçacığı yürütmeyi engeller. |
omp_set_nest_lock | Bir kilit kullanılabilir olana kadar iş parçacığı yürütmeyi engeller. |
omp_unset_lock | Kilidi serbest bırakır. |
omp_unset_nest_lock | İç içe bir kilit bırakır. |
omp_test_lock | Kilit ayarlamaya çalışır, ancak iş parçacığı yürütmeyi engellemez. |
omp_test_nest_lock | İç içe bir kilit ayarlamaya çalışır, ancak iş parçacığı yürütmeyi engellemez. |
Veri türü | Tanım |
---|---|
omp_lock_t |
Kilidin durumunu, kilidin kullanılabilir olup olmadığını veya bir iş parçacığının kilidi olup olmadığını tutan bir tür. |
omp_nest_lock_t |
Bir kilit hakkında aşağıdaki bilgi parçalarından birini tutan bir tür: kilidin kullanılabilir olup olmadığı ve kilidin sahibi olan iş parçacığının kimliği ve iç içe yerleştirme sayısı. |
Zamanlama yordamları için:
İşlev | Tanım |
---|---|
omp_get_wtime | Bir noktadan geçen sürenin saniye cinsinden değerini döndürür. |
omp_get_wtick | İşlemci saati değer değerleri arasındaki saniye sayısını döndürür. |
omp_destroy_lock
Kilidin başlatılmamış halini alır.
void omp_destroy_lock(
omp_lock_t *lock
);
Parametreler
lock
omp_init_lock ile başlatılan türde omp_lock_t
bir değişken.
Açıklamalar
Daha fazla bilgi için bkz . 3.2.2 omp_destroy_lock ve omp_destroy_nest_lock işlevleri.
Örnek
kullanma omp_destroy_lock
örneği için bkz. omp_init_lock.
omp_destroy_nest_lock
İç içe bir kilidi başlatmaz.
void omp_destroy_nest_lock(
omp_nest_lock_t *lock
);
Parametreler
lock
omp_init_nest_lock ile başlatılan türde omp_nest_lock_t
bir değişken.
Açıklamalar
Daha fazla bilgi için bkz . 3.2.2 omp_destroy_lock ve omp_destroy_nest_lock işlevleri.
Örnek
kullanma omp_destroy_nest_lock
örneği için bkz. omp_init_nest_lock.
omp_get_dynamic
Yaklaşan paralel bölgelerde kullanılabilen iş parçacığı sayısının çalışma zamanına göre ayarlanabileceğini gösteren bir değer döndürür.
int omp_get_dynamic();
Dönüş değeri
Sıfır olmayan bir değer, iş parçacıklarının dinamik olarak ayarlanacağı anlamına gelir.
Açıklamalar
İş parçacıklarının dinamik ayarı omp_set_dynamic ve OMP_DYNAMIC ile belirtilir.
Daha fazla bilgi için bkz . 3.1.7 omp_set_dynamic işlevi.
Örnek
kullanma omp_get_dynamic
örneği için bkz. omp_set_dynamic.
omp_get_max_threads
Kodda num_threads olmayan paralel bir bölge tanımlandıysa kullanılabilir iş parçacığı sayısına eşit veya ondan büyük bir tamsayı döndürür.
int omp_get_max_threads( )
Açıklamalar
Daha fazla bilgi için bkz . 3.1.3 omp_get_max_threads işlevi.
Örnek
// omp_get_max_threads.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
int main( )
{
omp_set_num_threads(8);
printf_s("%d\n", omp_get_max_threads( ));
#pragma omp parallel
#pragma omp master
{
printf_s("%d\n", omp_get_max_threads( ));
}
printf_s("%d\n", omp_get_max_threads( ));
#pragma omp parallel num_threads(3)
#pragma omp master
{
printf_s("%d\n", omp_get_max_threads( ));
}
printf_s("%d\n", omp_get_max_threads( ));
}
8
8
8
8
8
omp_get_nested
İç içe paralelliğin etkinleştirilip etkinleştirilmediğini gösteren bir değer döndürür.
int omp_get_nested( );
Dönüş değeri
Sıfır olmayan bir değer, iç içe paralelliğin etkinleştirildiği anlamına gelir.
Açıklamalar
İç içe paralellik omp_set_nested ve OMP_NESTED ile belirtilir.
Daha fazla bilgi için bkz . 3.1.10 omp_get_nested işlevi.
Örnek
kullanma omp_get_nested
örneği için bkz. omp_set_nested.
omp_get_num_procs
İşlev çağrıldığında kullanılabilen işlemci sayısını döndürür.
int omp_get_num_procs();
Açıklamalar
Daha fazla bilgi için bkz . 3.1.5 omp_get_num_procs işlevi.
Örnek
// omp_get_num_procs.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
int main( )
{
printf_s("%d\n", omp_get_num_procs( ));
#pragma omp parallel
#pragma omp master
{
printf_s("%d\n", omp_get_num_procs( ));
}
}
// Expect the following output when the example is run on a two-processor machine:
2
2
omp_get_num_threads
Paralel bölgedeki iş parçacığı sayısını döndürür.
int omp_get_num_threads( );
Açıklamalar
Daha fazla bilgi için bkz . 3.1.2 omp_get_num_threads işlevi.
Örnek
// omp_get_num_threads.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
int main()
{
omp_set_num_threads(4);
printf_s("%d\n", omp_get_num_threads( ));
#pragma omp parallel
#pragma omp master
{
printf_s("%d\n", omp_get_num_threads( ));
}
printf_s("%d\n", omp_get_num_threads( ));
#pragma omp parallel num_threads(3)
#pragma omp master
{
printf_s("%d\n", omp_get_num_threads( ));
}
printf_s("%d\n", omp_get_num_threads( ));
}
1
4
1
3
1
omp_get_thread_num
İş parçacığı ekibinde yürütülen iş parçacığının iş parçacığı numarasını döndürür.
int omp_get_thread_num( );
Açıklamalar
Daha fazla bilgi için bkz . 3.1.4 omp_get_thread_num işlevi.
Örnek
kullanma omp_get_thread_num
örneği için bkz. paralel.
omp_get_wtick
İşlemci saati değer değerleri arasındaki saniye sayısını döndürür.
double omp_get_wtick( );
Açıklamalar
Daha fazla bilgi için bkz . 3.3.2 omp_get_wtick işlevi.
Örnek
kullanma omp_get_wtick
örneği için bkz. omp_get_wtime.
omp_get_wtime
Bir noktadan geçen sürenin saniye cinsinden değerini döndürür.
double omp_get_wtime( );
Dönüş değeri
Rastgele ancak tutarlı bir noktadan geçen sürenin saniye cinsinden bir değer döndürür.
Açıklamalar
Bu nokta, program yürütme sırasında tutarlı olarak kalır ve yaklaşan karşılaştırmaları mümkün hale getirir.
Daha fazla bilgi için bkz . 3.3.1 omp_get_wtime işlevi.
Örnek
// omp_get_wtime.cpp
// compile with: /openmp
#include "omp.h"
#include <stdio.h>
#include <windows.h>
int main() {
double start = omp_get_wtime( );
Sleep(1000);
double end = omp_get_wtime( );
double wtick = omp_get_wtick( );
printf_s("start = %.16g\nend = %.16g\ndiff = %.16g\n",
start, end, end - start);
printf_s("wtick = %.16g\n1/wtick = %.16g\n",
wtick, 1.0 / wtick);
}
start = 594255.3671159324
end = 594256.3664474116
diff = 0.9993314791936427
wtick = 2.793651148400146e-007
1/wtick = 3579545
omp_in_parallel
Paralel bir bölgeden çağrılırsa sıfır olmayan döndürür.
int omp_in_parallel( );
Açıklamalar
Daha fazla bilgi için bkz . 3.1.6 omp_in_parallel işlevi.
Örnek
// omp_in_parallel.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
int main( )
{
omp_set_num_threads(4);
printf_s("%d\n", omp_in_parallel( ));
#pragma omp parallel
#pragma omp master
{
printf_s("%d\n", omp_in_parallel( ));
}
}
0
1
omp_init_lock
Basit bir kilit başlatır.
void omp_init_lock(
omp_lock_t *lock
);
Parametreler
lock
türünde omp_lock_t
bir değişken.
Açıklamalar
Daha fazla bilgi için bkz . 3.2.1 omp_init_lock ve omp_init_nest_lock işlevleri.
Örnek
// omp_init_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
omp_lock_t my_lock;
int main() {
omp_init_lock(&my_lock);
#pragma omp parallel num_threads(4)
{
int tid = omp_get_thread_num( );
int i, j;
for (i = 0; i < 5; ++i) {
omp_set_lock(&my_lock);
printf_s("Thread %d - starting locked region\n", tid);
printf_s("Thread %d - ending locked region\n", tid);
omp_unset_lock(&my_lock);
}
}
omp_destroy_lock(&my_lock);
}
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
omp_init_nest_lock
Bir kilit başlatır.
void omp_init_nest_lock(
omp_nest_lock_t *lock
);
Parametreler
lock
türünde omp_nest_lock_t
bir değişken.
Açıklamalar
İlk iç içe yerleştirme sayısı sıfırdır.
Daha fazla bilgi için bkz . 3.2.1 omp_init_lock ve omp_init_nest_lock işlevleri.
Örnek
// omp_init_nest_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
omp_nest_lock_t my_lock;
void Test() {
int tid = omp_get_thread_num( );
omp_set_nest_lock(&my_lock);
printf_s("Thread %d - starting nested locked region\n", tid);
printf_s("Thread %d - ending nested locked region\n", tid);
omp_unset_nest_lock(&my_lock);
}
int main() {
omp_init_nest_lock(&my_lock);
#pragma omp parallel num_threads(4)
{
int i, j;
for (i = 0; i < 5; ++i) {
omp_set_nest_lock(&my_lock);
if (i % 3)
Test();
omp_unset_nest_lock(&my_lock);
}
}
omp_destroy_nest_lock(&my_lock);
}
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region
omp_set_dynamic
Yaklaşan paralel bölgelerde kullanılabilen iş parçacığı sayısının çalışma zamanına göre ayarlanabileceğini gösterir.
void omp_set_dynamic(
int val
);
Parametreler
Val
Yaklaşan paralel bölgelerde kullanılabilen iş parçacığı sayısının çalışma zamanı tarafından ayarlanabileceğini gösteren bir değer. Sıfır değilse, çalışma zamanı iş parçacığı sayısını ayarlayabilir, sıfırsa çalışma zamanı iş parçacığı sayısını dinamik olarak ayarlamaz.
Açıklamalar
İş parçacığı sayısı, omp_set_num_threads veya OMP_NUM_THREADS tarafından ayarlanan değeri asla aşmaz.
geçerli ayarını omp_set_dynamic
görüntülemek için omp_get_dynamic kullanın.
ayarıomp_set_dynamic
, OMP_DYNAMIC ortam değişkeninin ayarını geçersiz kılar.
Daha fazla bilgi için bkz . 3.1.7 omp_set_dynamic işlevi.
Örnek
// omp_set_dynamic.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
int main()
{
omp_set_dynamic(9);
omp_set_num_threads(4);
printf_s("%d\n", omp_get_dynamic( ));
#pragma omp parallel
#pragma omp master
{
printf_s("%d\n", omp_get_dynamic( ));
}
}
1
1
omp_set_lock
Bir kilit kullanılabilir olana kadar iş parçacığı yürütmeyi engeller.
void omp_set_lock(
omp_lock_t *lock
);
Parametreler
lock
omp_init_lock ile başlatılan türde omp_lock_t
bir değişken.
Açıklamalar
Daha fazla bilgi için bkz . 3.2.3 omp_set_lock ve omp_set_nest_lock işlevleri.
Örnekler
kullanma omp_set_lock
örneği için bkz. omp_init_lock.
omp_set_nest_lock
Bir kilit kullanılabilir olana kadar iş parçacığı yürütmeyi engeller.
void omp_set_nest_lock(
omp_nest_lock_t *lock
);
Parametreler
lock
omp_init_nest_lock ile başlatılan türde omp_nest_lock_t
bir değişken.
Açıklamalar
Daha fazla bilgi için bkz . 3.2.3 omp_set_lock ve omp_set_nest_lock işlevleri.
Örnekler
kullanma omp_set_nest_lock
örneği için bkz. omp_init_nest_lock.
omp_set_nested
İç içe paralelliği etkinleştirir.
void omp_set_nested(
int val
);
Parametreler
Val
Sıfır olmayan bir değer iç içe paralelliği etkinleştirirken sıfır iç içe paralelliği devre dışı bırakır.
Açıklamalar
İç içe OMP paralelliği ile omp_set_nested
veya OMP_NESTED ortam değişkeni ayarlanarak açılabilir.
ayarı omp_set_nested
ortam değişkeninin OMP_NESTED
ayarını geçersiz kılar.
Ortam değişkeninin etkinleştirilmesi, paralel bölgeleri iç içe geçirirken iş parçacıklarının sayısı katlanarak artacağından, başka bir işlem programını bozabilir. Örneğin, OMP iş parçacığı sayısının 4 olarak ayarlandığı altı kez yinelenen bir işlev için 4.096 (6'nın gücüne 4) iş parçacığı gerekir. G/Ç'ye bağlı uygulamalar dışında, işlemcilerden daha fazla iş parçacığı varsa uygulamanın performansı genellikle düşer.
geçerli ayarını omp_set_nested
görüntülemek için omp_get_nested kullanın.
Daha fazla bilgi için bkz . 3.1.9 omp_set_nested işlevi.
Örnek
// omp_set_nested.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
int main( )
{
omp_set_nested(1);
omp_set_num_threads(4);
printf_s("%d\n", omp_get_nested( ));
#pragma omp parallel
#pragma omp master
{
printf_s("%d\n", omp_get_nested( ));
}
}
1
1
omp_set_num_threads
bir num_threads yan tümcesi tarafından geçersiz kılınmadığı sürece, yaklaşan paralel bölgelerdeki iş parçacığı sayısını ayarlar.
void omp_set_num_threads(
int num_threads
);
Parametreler
num_threads
Paralel bölgedeki iş parçacığı sayısı.
Açıklamalar
Daha fazla bilgi için bkz . 3.1.1 omp_set_num_threads işlevi.
Örnek
kullanma omp_set_num_threads
örneği için bkz. omp_get_num_threads.
omp_test_lock
Kilit ayarlamaya çalışır, ancak iş parçacığı yürütmeyi engellemez.
int omp_test_lock(
omp_lock_t *lock
);
Parametreler
lock
omp_init_lock ile başlatılan türde omp_lock_t
bir değişken.
Açıklamalar
Daha fazla bilgi için bkz . 3.2.5 omp_test_lock ve omp_test_nest_lock işlevleri.
Örnek
// omp_test_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
omp_lock_t simple_lock;
int main() {
omp_init_lock(&simple_lock);
#pragma omp parallel num_threads(4)
{
int tid = omp_get_thread_num();
while (!omp_test_lock(&simple_lock))
printf_s("Thread %d - failed to acquire simple_lock\n",
tid);
printf_s("Thread %d - acquired simple_lock\n", tid);
printf_s("Thread %d - released simple_lock\n", tid);
omp_unset_lock(&simple_lock);
}
omp_destroy_lock(&simple_lock);
}
Thread 1 - acquired simple_lock
Thread 1 - released simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 2 - acquired simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 2 - released simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - acquired simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - released simple_lock
Thread 3 - failed to acquire simple_lock
Thread 3 - acquired simple_lock
Thread 3 - released simple_lock
omp_test_nest_lock
İç içe bir kilit ayarlamaya çalışır, ancak iş parçacığı yürütmeyi engellemez.
int omp_test_nest_lock(
omp_nest_lock_t *lock
);
Parametreler
lock
omp_init_nest_lock ile başlatılan türde omp_nest_lock_t
bir değişken.
Açıklamalar
Daha fazla bilgi için bkz . 3.2.5 omp_test_lock ve omp_test_nest_lock işlevleri.
Örnek
// omp_test_nest_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
omp_nest_lock_t nestable_lock;
int main() {
omp_init_nest_lock(&nestable_lock);
#pragma omp parallel num_threads(4)
{
int tid = omp_get_thread_num();
while (!omp_test_nest_lock(&nestable_lock))
printf_s("Thread %d - failed to acquire nestable_lock\n",
tid);
printf_s("Thread %d - acquired nestable_lock\n", tid);
if (omp_test_nest_lock(&nestable_lock)) {
printf_s("Thread %d - acquired nestable_lock again\n",
tid);
printf_s("Thread %d - released nestable_lock\n",
tid);
omp_unset_nest_lock(&nestable_lock);
}
printf_s("Thread %d - released nestable_lock\n", tid);
omp_unset_nest_lock(&nestable_lock);
}
omp_destroy_nest_lock(&nestable_lock);
}
Thread 1 - acquired nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 1 - acquired nestable_lock again
Thread 0 - failed to acquire nestable_lock
Thread 1 - released nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 1 - released nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 3 - acquired nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 3 - acquired nestable_lock again
Thread 0 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 3 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 3 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - acquired nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - acquired nestable_lock again
Thread 2 - failed to acquire nestable_lock
Thread 0 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - acquired nestable_lock
Thread 2 - acquired nestable_lock again
Thread 2 - released nestable_lock
Thread 2 - released nestable_lock
omp_unset_lock
Kilidi serbest bırakır.
void omp_unset_lock(
omp_lock_t *lock
);
Parametreler
lock
İş parçacığının sahip olduğu ve işlevinde yürütülen omp_init_lock ile başlatılan türde omp_lock_t
bir değişken.
Açıklamalar
Daha fazla bilgi için bkz . 3.2.4 omp_unset_lock ve omp_unset_nest_lock işlevleri.
Örnek
kullanma omp_unset_lock
örneği için bkz. omp_init_lock.
omp_unset_nest_lock
İç içe bir kilit bırakır.
void omp_unset_nest_lock(
omp_nest_lock_t *lock
);
Parametreler
lock
İş parçacığının sahip olduğu ve işlevinde yürütülen omp_init_nest_lock ile başlatılan türde omp_nest_lock_t
bir değişken.
Açıklamalar
Daha fazla bilgi için bkz . 3.2.4 omp_unset_lock ve omp_unset_nest_lock işlevleri.
Örnek
kullanma omp_unset_nest_lock
örneği için bkz. omp_init_nest_lock.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin