Pertanyaan C # kelanjutan kelas pertama melalui C + + interop atau beberapa cara lain?


Kami memiliki multitasking kinerja yang sangat tinggi, mendekati aplikasi C # waktu nyata. Kinerja ini dicapai terutama dengan menerapkan multitasking kooperatif di-rumah dengan penjadwal rumah tumbuh. Ini sering disebut micro-thread. Dalam sistem ini semua tugas berkomunikasi dengan tugas lain melalui antrian.

Masalah spesifik yang kita miliki tampaknya hanya dapat dipecahkan melalui kelanjutan kelas pertama yang tidak didukung oleh C #.

Khususnya masalah muncul dalam 2 kasus berurusan dengan antrian. Setiap kali tugas tertentu melakukan beberapa pekerjaan sebelum menempatkan item pada antrian. Bagaimana jika antrean sudah penuh?

Sebaliknya, tugas yang berbeda dapat melakukan beberapa pekerjaan dan kemudian perlu mengeluarkan item dari antrean. Bagaimana jika antrean itu kosong?

Kami telah menyelesaikan ini dalam 90% kasus dengan menghubungkan antrean ke tugas untuk menghindari tugas yang diminta jika antrian keluar mereka penuh atau antrean masuk kosong.

Selanjutnya tugas-tugas tertentu diubah menjadi mesin negara sehingga mereka dapat menangani jika antrian penuh / kosong dan berlanjut tanpa menunggu.

Masalah sebenarnya muncul dalam beberapa kasus tepi di mana tidak praktis untuk melakukan salah satu dari solusi tersebut. Gagasan dalam skenario itu adalah menyelamatkan keadaan tumpukan pada titik dan beralih ke tugas yang berbeda sehingga dapat melakukan pekerjaan dan kemudian mencoba kembali tugas menunggu kapan pun ia dapat melanjutkan.

Di masa lalu, kami mencoba untuk meminta tugas menunggu memanggil kembali ke jadwal (secara rekursif) untuk memungkinkan tugas lain untuk dan kemudian mencoba kembali tugas yang menunggu. Namun, itu menyebabkan terlalu banyak situasi "kebuntuan".

Ada contoh di suatu tempat dari host CLR kustom untuk membuat. NET thread sebenarnya beroperasi sebagai "serat" yang pada dasarnya memungkinkan switching stack state antara utas. Tapi sekarang saya tidak bisa menemukan kode contoh untuk itu. Plus tampaknya akan mengambil beberapa kompleksitas yang signifikan untuk melakukannya dengan benar.

Adakah yang punya ide kreatif lain bagaimana beralih di antara tugas secara efisien dan menghindari masalah di atas?

Apakah ada host CLR lain yang menawarkan ini, komersial atau lainnya? Apakah ada perpustakaan asli tambahan yang dapat menawarkan beberapa bentuk lanjutan untuk C #?


32
2017-12-31 02:05


asal


Jawaban:


Ada itu C # 5 CTP, yang melakukan transformasi continuing-passing-style atas metode yang dideklarasikan dengan yang baru async kata kunci, dan panggilan berdasarkan kelanjutan-kelanjutan saat menggunakan await kata kunci.

Ini sebenarnya bukan fitur CLR baru melainkan satu set arahan untuk compiler untuk melakukan transformasi CPS atas kode Anda dan beberapa rutinitas perpustakaan untuk memanipulasi dan menjadwalkan kelanjutan. Catatan aktivasi untuk async metode ditempatkan di heap alih-alih tumpukan, jadi mereka tidak terikat pada utas tertentu.


2
2018-02-15 12:40



Tidak, tidak akan berhasil. C # (dan bahkan IL) adalah bahasa yang terlalu rumit untuk melakukan transformasi seperti itu (CPS) secara umum. Yang terbaik yang bisa Anda dapatkan adalah apa yang akan ditawarkan oleh C # 5. Yang mengatakan, Anda mungkin tidak dapat memutuskan / melanjutkan dengan urutan loop / iterasi yang lebih tinggi, yang benar-benar ingin Anda inginkan dari kelanjutan yang dapat diperbarui secara umum.


1
2018-02-15 12:45



Mode serat dihapus dari v2 dari CLR karena masalah-masalah di bawah tekanan, lihat:

Untuk pengetahuan saya, dukungan serat belum ditambahkan kembali, meskipun dari membaca artikel di atas mungkin ditambahkan lagi (namun fakta bahwa tidak ada yang disebutkan selama 6-7 tahun pada topik ini membuat saya percaya bahwa itu tidak mungkin).

Dukungan serat FYI dimaksudkan untuk menjadi cara untuk aplikasi yang ada yang menggunakan serat (seperti SQL Server) untuk meng-host CLR dengan cara yang memungkinkan mereka untuk memaksimalkan kinerja, tidak sebagai metode untuk memungkinkan aplikasi .Net untuk membuat hundereds utas - dalam serat pendek bukanlah solusi peluru ajaib untuk masalah AndaNamun, jika Anda memiliki aplikasi yang menggunakan serat keinginan untuk menjadi tuan rumah CLR maka API hosting yang dikelola memberikan cara bagi CLR untuk "bekerja dengan baik" dengan aplikasi Anda. Sumber informasi yang baik tentang ini adalah dikelola dokumentasi API hosting, atau untuk melihat bagaimana SQL Server menjadi tuan rumah CLR, di mana ada beberapa artikel yang sangat informatif.

Juga membaca cepat Benang, serat, tumpukan dan ruang alamat.


1
2018-02-15 13:24



Sebenarnya, kami memutuskan arah untuk mengikuti ini. Kami menggunakan pola Observer dengan Message Passsing. Kami membangun perpustakaan yang ditumbuhkan di rumah untuk menangani semua komunikasi antara "Agen" yang mirip dengan proses Erlang. Nanti kita akan mempertimbangkan menggunakan AppDomains untuk Agen yang terpisah lebih baik dari satu sama lain. Ide desain dipinjam dari bahasa pemrograman Erlang yang memiliki proses multi-core dan distribusi yang sangat andal.


1
2018-02-15 15:08



Solusi untuk masalah Anda adalah dengan menggunakan algoritma bebas-lock yang memungkinkan untuk kemajuan sistem yang luas dari setidaknya satu tugas. Anda perlu menggunakan inline assembler yang bergantung pada CPU untuk memastikan bahwa Anda CAS atom (bandingkan-dan-swap). Wikipedia memiliki artikel begitu juga pola yang dijelaskan Book oleh Douglas Schmidt disebut "Arsitektur Perangkat Berorientasi Pola, Pola untuk Objek Bersamaan dan Jaringan". Tidak jelas bagi saya bagaimana Anda akan melakukannya di bawah kerangka dotnet.

Cara lain untuk memecahkan masalah Anda adalah menggunakan pola publish-subscriber atau kemungkinan thread pools.

Semoga ini bermanfaat?


0
2018-01-31 21:22